300 - 309
动态规划可以图像化为状态机,分清有多少个状态,有多少中状态转移方式!
309. 最佳买卖股票时机含冷冻期** - medium
好吧,又把我难住了。。。
参考 liweiwei1419 解释
- 这道股票题和第二道股票题很想,区别在于多了一个冻结期,因此状态之间的转移只能是:(图片来自 liweiwei1419 )
其中只要你想要持股,就必须在前一天没有进行过买卖,也就是说是从冷冻期过渡到持股期(即使你前一天没动作,所持有的金额也是等于上一次的冷冻期,相当于直接从冷冻期到持股期),所以图中关系成立,图中有三个状态,有五种状态转移方式。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
if(len < 2) return 0;
vector<int> dp0(len, 0);
vector<int> dp1(len, 0);
// 三个状态
dp0[0] = 0; // 不持股
dp1[0] = -prices[0];// 持股期
int flag = 0; // 冷冻期
for(int i = 1; i < len; i++) {
// 五个转移方式
dp0[i] = max(dp0[i-1], prices[i] + dp1[i-1]);
dp1[i] = max(dp1[i-1], flag - prices[i]);
flag = dp0[i-1];
}
return max(flag, dp0.back());
}
};
300. 最长上升子序列 - medium
//22.53
//23.01
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int len = nums.size();
if(len < 2) return len;
vector<int> dp(len, 1);
int maxLen = 1;
for(int i = 1; i < len; i++) {
for(int k = 0; k < i; k++) {
if(nums[i] > nums[k])
dp[i] = max(dp[i], dp[k]+1);
}
maxLen = max(dp[i], maxLen);
}
return maxLen;
}
};