序列型和坐标型的最大区别是序列型不是简单的用坐标表示DP值,而一般需要加上状态。
https://leetcode.com/problems/house-robber/
按照解决DP问题的一般情况来,我们先分析最后一步。最后一步的最优策略中,有可能偷,也可能不偷最后一栋房。那么为了方便计算,一般我们可以考虑在dp中加入一个状态。
所以这个问题可以简化为是否偷I – 1套房子。那么我们可以将DP定义简化:
代码就很简单了:
public int rob(int[] nums) {
int[] dp = new int[nums.length + 1];
dp[0] = 0;
dp[1] = nums[0];
for (int i = 2; i <= nums.length; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i - 1], dp[i - 1]);
}
return dp[nums.length];
}
https://leetcode.com/problems/house-robber-ii/
这道题因为房子连成一个圆圈,首尾相连,那么从0号房子出发和从1号房子出发是两个独立的