题解 | #不能连续吃草的牛#

不能连续吃草的牛

https://www.nowcoder.com/practice/64d9400c321042acb754a9455852a8d7

知识点

一维线性动态规划

思路

第i天吃与不吃的选择,是由第i-1天和i-2天转移过来的。

如果第i天不吃,那么可以从第i-1天的吃或不吃转移过来

如果第i天吃,那么只能从第i-1天的不吃转移过来,此外还可以从第i-2天的吃转移过来。

不妨用dp[n][2]表示状态,dp[i][k]中,i表示第i天,k取值为0或1,分别表示吃与不吃,值为饱腹感。 有如下状态转移方程:

dp[i][0]=max(dp[i-1][1],dp[i-1][0]);

dp[i][1]=max(dp[i-1][0],dp[i-2][1])+nums[i];

初始化

整个dp数组初始化为0即可,因为一开始都是不吃的,饱腹感为0.

注意dp[1][0]=nums[0],dp[1][1]=nums[1],dp[0][1]=nums[0]

代码c++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int eatGrass(vector<int>& nums) {
       int dp[10005][2];
memset(dp,0,sizeof dp);
       dp[0][1]=nums[0];
       dp[0][0]=0;
       dp[1][1]=nums[1];
       dp[1][0]=nums[0];
       int res=-1;
       int n=nums.size();
       for(int i=2;i<nums.size();i++)
       {
        dp[i][0]=max(dp[i-1][1],dp[i-1][0]);

        dp[i][1]=max(dp[i-1][0],dp[i-2][1])+nums[i];
       
        
       } 
       //for(int i=0;i<n;i++)cout<<dp[i][0]<<"  "<<dp[i][1]<<endl;
       res= max(dp[n-1][0],dp[n-1][1]);
       return res;
     
    }
};
#动态规划#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务