![](https://img-blog.csdnimg.cn/img_convert/cda1b3c7a96ae8abc01a2e3692114e69.png)
经典的dp打家劫舍问题(不过...是打家劫舍II)
这里先推荐看看打家劫舍I 👉 1301:大盗阿福_小王子009的博客-CSDN博客(要不然你会看不懂)
言归正传
这题其实只要做两遍打家劫舍I
选第0家 不选n-1家
dp[0][0] = 0;
dp[0][1] = a[0];
for (int i = 1; i < n; i ++) {
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + a[i];
}
不选第0家 选n-1家
dp[0][0] = 0;
dp[0][1] = 0;
for (int i = 1; i < n; i ++) {
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + a[i];
}
(注意!这里的下标是 0 ~ n-1)
代码:
int dp[105][2] = {0};
class Solution {
public:
int rob(vector<int>& a) {
int n = a.size(), ans = 0;
if (n == 1) //如果只有一家店
return a[0];
dp[0][0] = 0;
dp[0][1] = a[0];
for (int i = 1; i < n; i ++) {
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + a[i];
}
ans = dp[n-1][0];
dp[0][0] = 0;
dp[0][1] = 0;
for (int i = 1; i < n; i ++) {
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + a[i];
}
return max(ans, dp[n-1][1]);
}
};