题解 | #不能连续吃草的牛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;
}
}
深信服公司福利 830人发布