11. 按摩师(easy)
https://leetcode.cn/problems/the-masseuse-lcci/submissions/575467387/
class Solution {
public:
int massage(vector<int>& nums) {
int n=nums.size();
if(n==0)//处理边界情况
return 0;
vector<int> fdp(n);//当前位置选择预约
vector<int> gdp(n);//当前位置不选择预约
fdp[0]=nums[0];
gdp[0]=0;
for(int i=1;i<n;i++)
{
fdp[i]=gdp[i-1]+nums[i];
gdp[i]=max(gdp[i-1],fdp[i-1]);
}
return max(fdp[n-1],gdp[n-1]);
}
};
12. 打家劫舍II(medium)
https://leetcode.cn/problems/house-robber-ii/description/
class Solution {
public:
int _rob(vector<int>& nums,int left,int right)
{
if(left>right)return 0;//处理边界情况
int n=nums.size();//尽管不需要开这么大空间,但这样可以让nums下标与dp表下标相同,否则要去映射了
vector<int> fdp(n);
vector<int> gdp(n);
fdp[left]=nums[left];
gdp[left]=0;
for(int i=left+1;i<=right;i++)
{
fdp[i]=gdp[i-1]+nums[i];
gdp[i]=max(gdp[i-1],fdp[i-1]);
}
return max(fdp[right],gdp[right]);
}
int rob(vector<int>& nums) {
//类似上一道题,不过就是当我们选择0位置时我们也不能选择最后一个位置
//分为两种情况选择第一个位置和不选择选择第一个位置
//第一种情况第二个位置和最后一个位置不选,区间变为[2,3,......,n-2]
//第二种情况区间变为[1,2,3,...,n-1]
int n=nums.size();
return max(nums[0]+_rob(nums,2,n-2),_rob(nums,1,n-1));
}
};
13. 删除并获得点数(medium)
https://leetcode.cn/problems/delete-and-earn/submissions/575477083/
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
//倘若数组元素都是相邻的我们就可以沿用上题的操作
//也许我们可以通过排序将相邻的元素按顺序
//但是遗憾的是数组中会缺少某些相邻的元素
//我们可以通过一个新数组的下标去映射原数组,因为数组的下标是相邻的
const int array_max=10001;
vector<int> hash(array_max);
for(auto ch:nums)
hash[ch]+=ch;
vector<int> fdp(array_max);
vector<int> gdp(array_max);
fdp[0]=hash[0];
for(int i=1;i<array_max;i++)
{
fdp[i]=gdp[i-1]+hash[i];
gdp[i]=max(gdp[i-1],fdp[i-1]);
}
return max(gdp[array_max-1],fdp[array_max-1]);
}
};
14. 粉刷房⼦(medium)
https://leetcode.cn/problems/JEj789/submissions/575481018/
class Solution {
public:
int minCost(vector<vector<int>>& costs) {
//当前房子粉刷某种颜色取决于上一个房子粉刷了什么颜色
int m=costs.size();
vector<vector<int>>dp (m,vector<int>(3));
dp[0][0]=costs[0][0];//第一个房子涂红
dp[0][1]=costs[0][1];//第一个房子涂蓝
dp[0][2]=costs[0][2];//第一个房子涂绿
for(int i=1;i<m;i++)
{
dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i][0];//当前房子涂红,上一个房子涂什么颜色费用最少
dp[i][1]=min(dp[i-1][0],dp[i-1][2])+costs[i][1];//当前房子涂蓝,上一个房子涂什么颜色费用最少
dp[i][2]=min(dp[i-1][0],dp[i-1][1])+costs[i][2];//当前房子涂绿,上一个房子涂什么颜色费用最少
}
return min(dp[m-1][0],min(dp[m-1][1],dp[m-1][2]));
}
};
15. 买卖股票的最佳时机含冷冻期(medium)
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/submissions/575503023/
class Solution {
public:
int maxProfit(vector<int>& prices) {
//一共有三种情况
//股票交易当天结束后再计算
//注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
//冷冻期导致第二天不能买股票
//当天结束指的是下一天的状态,当天还可以进行操作
//当天结束后处于手上有股票(前一天手上有股票或者前一天手上没股票今天买入股票)
//当天结束后处于冷冻期(前一天手上有股票且今天卖出)
//当天结束后处于手上没股票且不是冷冻期(前一天处于冷冻期或前天手上没股票且不是冷冻期)
int n=prices.size();
vector<vector<int>>dp(n,vector<int>(3));
dp[0][0]=-prices[0];
for(int i=1;i<n;i++)
{
dp[i][0]=max(dp[i-1][0],dp[i-1][2]-prices[i]);
dp[i][1]=dp[i-1][0]+prices[i];
dp[i][2]=max(dp[i-1][1],dp[i-1][2]);
}
//最后返回的都是手上没股票的情况
return max(dp[n-1][1],dp[n-1][2]);
}
};