【DP】这个和198. 打家劫舍的唯一不同就是第一个和最后一个需要特殊处理,因此在DP的时候可以分第一个选了和没选进行讨论。如果选了那么第二个和最后一个一定不能选,就是从[3, n - 1] DP;如果没选就是从[1, n] DP。
class Solution {
public int rob(int[] nums) {
int n = nums.length, ans = 0;
int[][] dp = new int[n + 1][2];
// get 1
dp[1][0] = 0; dp[1][1] = nums[0];
for (int i = 2; i <= n; i++) {
int x = nums[i - 1];
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
if (i == 2) dp[i][1] = 0;
else if (i == n) dp[i][1] = Math.max(dp[i - 1][0], dp[i - 1][1]);
else dp[i][1] = dp[i - 1][0] + x;
}
ans = Math.max(dp[n][0], dp[n][1]);
// not get 1
for (int i = 1; i <= n; i++) Arrays.fill(dp[i], 0);
dp[1][0] = 0; dp[1][1] = 0;
for (int i = 2; i <= n; i++) {
int x = nums[i - 1];
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = dp[i - 1][0] + x;
}
return Math.max(ans, Math.max(dp[n][0], dp[n][1]));
}
}