题解 | #不能连续吃草的牛#
不能连续吃草的牛
https://www.nowcoder.com/practice/64d9400c321042acb754a9455852a8d7
知识点:动态规划
思路:
- 首先,定义一个名为
eatGrass
的静态方法,该方法接受一个整数数组作为参数,并返回一个整数。 - 定义一个常量
INF
,表示无穷大的值,这里使用0x3f3f3f3f
表示。 - 获取整数数组
nums
的长度n
。 - 创建一个二维整数数组
f
,其大小为(n + 1) × 2
,用于记录状态。 - 初始化
f[0][0]
为0,表示未偷窃当前房间时的累计价值为0。 - 使用一个
for
循环,从1到n遍历整数数组nums
,并更新状态数组f
。 - 对于每个位置
i
,考虑两种情况:如果不偷窃当前房间,则累计价值为前一个房间的最大累计价值,即f[i - 1][0]和f[i - 1][1]中的较大值。如果偷窃当前房间,则累计价值为f[i - 1][0]加上当前房间的价值nums[i - 1]。 - 更新状态数组
f[i][0]
和f[i][1]
的值。 - 循环结束后,返回
f[n][0]
和f[n][1]
中的较大值作为最终的结果。 - 在
main
方法中,创建一个示例用法,将一个整数数组作为参数传递给eatGrass
方法,并打印出能够吃到的最大草量。
编程语言:java
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public static int eatGrass(int[] nums) { final int INF = 0x3f3f3f3f; int n = nums.length; int[][] f = new int[n + 1][2]; f[0][0] = 0; for (int i = 1; i <= n; i++) { f[i][0] = Math.max(f[i - 1][0], f[i - 1][1]); f[i][1] = f[i - 1][0] + nums[i - 1]; } return Math.max(f[n][0], f[n][1]); } }