题解 | #不能连续吃草的牛#
不能连续吃草的牛
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]);
}
}
查看7道真题和解析
