class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int max(int a, int b){
return a>b?a:b;
}
int rob(vector<int>& nums) {
int n = nums.size();
//res1 不偷第一家的情况
vector<int> dp1(n+1,0);dp1[1] = 0;
for(int i = 2 ; i <= n ;i++ ){
dp1[i] = max(dp1[i-1],dp1[i-2]+nums[i-1] );
}
int res1 = dp1[n];
//res2 偷第一家的情况
vector<int> dp2(n,0);
dp2[1] = nums[0];
for(int i = 2 ; i < n ;i++ ){
dp2[i] = max(dp2[i-1],dp2[i-2]+nums[i-1] );
}
int res2 = dp2[n-1];
return max(res1,res2);
}
};
一位dp中等题,对于这种环形问题,可以拆分成2 个方向,一个是要第一个,另一个是不要第一个,拆分成2个来分别动态规划

京公网安备 11010502036488号