思路:
动态规划,考虑两种情况,第一种是不选第一个,第二种是不选最后一个,最后取max。
代码:
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(!n) return 0;
if(n == 1) return nums[0];
vector<int> f(n + 1);//选i
auto g = f;//不选i
//先不选1号点
//然后再计算选1号点不选n
for(int i = 2 ;i <= n; i++){
f[i] = g[i - 1] + nums[i - 1];
g[i] = max(f[i - 1],g[i - 1]);
}
int res = max(g[n],f[n]);
//第二种
for(int i = 1;i <= n;i++){
f[i] = g[i - 1] + nums[i - 1];
g[i] = max(f[i - 1],g[i - 1]);
}
return max(res,g[n]);
}
};
评论区