题解 | #不能连续吃草的牛II#
不能连续吃草的牛II
https://www.nowcoder.com/practice/0b6e9ca056eb4166b4bfd4f7c90b2c61
知识点:动态规划
思路:
- 首先,定义一个名为
eatGrass
的静态方法,该方法接受一个整数数组作为参数,并返回一个整数。 - 创建一个二维整数数组
f
,大小为1005 × 2
,用于记录状态。 - 获取整数数组
nums
的长度n
。 - 如果
n
等于1,直接返回数组中唯一的元素nums[0]
作为结果。 - 如果
n
等于2,返回数组中两个元素中的较大值作为结果。 - 初始化一个变量
res
为0,用于记录最大的累计值。 - 针对不同的情况进行计算:不取第n间,取第1间,不取第2间:使用一个循环从3到n-1,更新状态数组f。对于当前位置i,分别考虑不取第n间和取第n间两种情况。不取n-1间,取第n间,不取第一间:使用一个循环从2到n-2,更新状态数组f。对于当前位置i,分别考虑不取第一间和取第一间两种情况。第1间和n间都不取:使用一个循环从2到n-1,更新状态数组f。对于当前位置i,分别考虑不取第1间和取第1间两种情况。
- 在每种情况结束后,更新
res
为当前情况的累计值与res
的较大值。 - 返回
res
作为最终的结果。 - 在
main
方法中,创建一个示例用法,将一个整数数组作为参数传递给eatGrass
方法,并打印出能够吃到的最大草量。
编程语言:java
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public static int eatGrass(int[] nums) { int[][] f = new int[1005][2]; int n = nums.length; if (n == 1) return nums[0]; if (n == 2) return Math.max(nums[0], nums[1]); int res = 0; // 不取第n间 取第1间, 不取第2间 for (int i = 3; 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]; } res = Math.max(res, Math.max(f[n - 1][0], f[n - 1][1]) + nums[0]); // 不取n - 1间 取第n间 不取第一间 for (int i = 2; i < n - 1; i++) { f[i][0] = Math.max(f[i - 1][0], f[i - 1][1]); f[i][1] = f[i - 1][0] + nums[i - 1]; } res = Math.max(res, Math.max(f[n - 2][0], f[n - 2][1]) + nums[n - 1]); // 第1间和n间 都不取 for (int i = 2; 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]; } res = Math.max(res, Math.max(f[n - 1][0], f[n - 1][1])); return res; } }