题解 | #不能连续吃草的牛II#
不能连续吃草的牛II
https://www.nowcoder.com/practice/0b6e9ca056eb4166b4bfd4f7c90b2c61
考察的知识点:动态规划;
解答方法分析:
- 判断列表长度。如果列表长度为0,返回;如果长度为1,直接返回列表中唯一的元素。
- 计算链1的最大饱腹感值。创建数组dp1,长度为n+1,初始化为0。数组dp1的每个元素dp1[i]表示以列表中的第i个元素为链1的最后一个节点时最大饱腹感值。特殊情况下,dp1[0] = 0,dp1[1] = nums[0]。从第2个元素开始遍历,计算dp1[i]的值为前两个元素的最大饱腹感值加上第i-1个元素的值。最后的结果为dp1[n-1],即链1的最大饱腹感值。
- 计算链2的最大饱腹感值。创建数组dp2,长度为n+1,初始化为0。数组dp2每个元素dp2[i]表示以列表中的第i个元素为链2的最后一个节点时的最大饱腹感值。特殊情况下,dp2[0] = 0,dp2[1] = nums[1]。从第2个元素开始遍历,计算dp2[i]的值为前两个元素的最大饱腹感值加上第i个元素的值。最后的结果为dp2[n-1],即链2的最大饱腹感值。
- 返回链1和链2最大饱腹感值中的较大值,即max(max_sum1, max_sum2)。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int eatGrass(vector<int>& nums) { int n = nums.size(); if (n == 0) { return 0; } if (n == 1) { return nums[0]; } vector<int> dp1(n + 1, 0); dp1[0] = 0; dp1[1] = nums[0]; for (int i = 2; i < n; i++) { dp1[i] = max(dp1[i - 1], dp1[i - 2] + nums[i - 1]); } int max_sum1 = dp1 [- 1]; vector<int> dp2(n + 1, 0); dp2[0] = 0; dp2[1] = nums[1]; for (int i = 2; i < n; i++) { dp2[i] = max(dp2[i - 1], dp2[i - 2] + nums[i]); } int max_sum2 = dp2[n - 1]; return (max_sum1, max_sum2); } };