前置题目
198. 打家劫舍
方法:
如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k (k>2) 间房屋,有两个选项:
- 偷窃第 k 间房屋,那么就不能偷窃第 k-1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。
- 不偷窃第 k 间房屋,偷窃总金额为前 k-1 间房屋的最高总金额。
因此推出状态转移方程:
Code
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty()){
return 0;
}
int size = nums.size();
if(size==1){
return nums[0];
}
//前i间房屋能偷窃到的最高总金额
vector<int> dp = vector<int>(size,0);
dp[0] = nums[0]; //边界条件
dp[1] = max(nums[0],nums[1]);
for(int i = 2;i<size;++i){
dp[i] = max(dp[i-2] + nums[i],dp[i-1]);
}
return dp[size-1];
}
};
//https://leetcode-cn.com/problems/house-robber/solution/da-jia-jie-she-by-leetcode-solution/
740. 删除并获得点数
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
int maxVal = 0;
for(int num:nums){
maxVal = max(maxVal,num);
}
int sums[maxVal+1];
//初始化为0
memset(sums,0,sizeof(int)*(maxVal+1));
for(int num:nums){
sums[num] += num;
}
//简化空间复杂度
int d2 = sums[0];
int d1 = sums[1];
for(int i = 2;i<=maxVal;++i){
//临时拷贝后续赋值给d2
int temp = d1;
//计算新的d1
d1 = max(d2+sums[i],d1);
//d[i-1]->d[i-2]
d2 = temp;
}
return d1;
}
};
//https://leetcode-cn.com/problems/delete-and-earn/solution/740-cji-hu-shuang-bai-de-dong-tai-gui-hu-blc8/