【动态规划】状态机模型:打家劫舍1_i++

题目链接: 力扣

 思路:

动态规划:

线性dp:

  定义dp数组:dp[i]偷到下标为i获得最高金额

状态转移方程:   偷第i家 ,  dp[i]=dp[i-2]+nums[i]

                         不偷第i家,dp[i]=dp[i-1]

                            所以,dp[i]=max( dp[i-2]+nums[i]  ,dp[i-1] )   (注意i要大于等于2)

              出口:    dp[0]=nums[0] ,dp[1]=max{nums[0],nums[1]}(如果nums个大于1)

代码:

class Solution {
public:
    int rob(vector<int>& nums) {
vector<int>dp(nums.size());
if(nums.size()==1)
return nums[0];
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<nums.size();i++)
{
    dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[nums.size()-1];
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

状态机模型:

dp[i][0]表示抢前i家且第i家不抢的最大值

dp[i][1]表示抢前i家且第i家抢的最大值

状态转移:

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

dp[i][1]=dp[i-1][0]+w[i]

初始化:

dp[0][0]=0

dp[0][1]=-INF

【动态规划】状态机模型:打家劫舍1_i++_02

 

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100010,INF=0x3f3f3f3f;
int n;
int w[N],f[N][2];
int main(){
    int T;
    cin>>T;
    while(T--){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>w[i];
        }
      
        f[0][0]=0;
        f[0][1]=-INF;
  
        for(int i=1;i<=n;i++){
            f[i][0]=max(f[i-1][0],f[i-1][1]);
            f[i][1]=f[i-1][0]+w[i];
        }
        cout<<max(f[n][0],f[n][1])<<endl;
    }
    return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.