leetcode 198 打家劫舍问题,两个dp数组->一个dp数组
一开始,联想到最长上升子数列,考虑最后一家,打劫或不打劫两种情况,设计了两个dp数组分别表示,代码如下:
class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<int> dp1(n+1, 0), dp2(n+1, 0);dp1[1] = nums[0];for(int i=2;i<=n;i++){dp1[i] = nums[i-1] + max(dp1[i-2], dp2[i-1]);dp2[i] = max(dp1[i-1], dp2[i-1]);}return max(dp1[n], dp2[n]);}
};
但是很快发现,做的复杂了,实际一个dp数组就可以搞定:
class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<int> dp(n+1, 0);dp[1] = nums[0];for(int i=2;i<=n;i++){dp[i] = max(dp[i-2]+nums[i-1], dp[i-1]);}return dp[n];}
};
这里面没有考虑结尾的情况。我们可以这么想,在当前状态下,这个房子只有打或者不打两种情况,如果打,那i-1肯定是不打的,所以我们只需要考虑dp[i-2]即可。如果不打,那么考虑dp[i-1]即可,这种做法可以将结尾状态隐含表示,是更优的做法。