leetcode 188 买卖股票的最佳时机IV
LeetCode 股票 买卖 IV 最佳时机
2023-09-27 14:29:24 时间
买卖股票的最佳时机IV
确定dp数组以及下标的含义
- 没操作
- 持有股票(包括之前买的和今天买的)
- 不持有股票(包括之前没买和今天卖了)
dp[i][j]中 i表示第i天,j为 k*2+1 个状态,dp[i][j]表示第i天状态j所剩最大现金。
确定递推公式
-
达到持有状态,有两个具体操作:
- 第i天买入股票了,那么dp[i][j] (j%2==1) = dp[i-1][j-1] - prices[i]
- 第i天没有操作,而是沿用前一天买入的状态,
即:dp[i [j] = dp[i - 1][j] (j%2==1)
-
达到不持有状态,也有两个操作:
- 第i天卖出股票了,那么dp[i]j = dp[i - 1][j-1] + prices[i]
- 第i天没有操作,沿用前一天卖出股票的状态,
即:dp[i][j] = dp[i - 1][j] (j%2==0)
dp数组如何初始化
- dp[0][0] = 0;
- dp[0][j] = -prices[0]; (j%2==1)
- dp[0][j] = 0; (j%2==0)
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
if(prices.size()<= 1) return 0;
vector<vector<int>> dp(prices.size(),vector<int>( k*2+1 ,0));
for(int j=0 ; j < k*2+1 ; j++)
{
if(j%2 == 1) dp[0][j] = -prices[0];//持有股票
// cout<<dp[0][j]<<' ';
}
// cout<<endl;
for(int i=1 ;i<prices.size() ; i++)
{
for(int j=0 ; j< k*2+1 ;j++)
{
//无操作
if(j == 0) dp[i][j] = dp[i-1][j];
//持有股票
else if(j%2 == 1) dp[i][j] = max( dp[i-1][j] , dp[i-1][j-1] - prices[i] );
//未持有股票
else if(j%2 == 0) dp[i][j] = max( dp[i-1][j] , dp[i-1][j-1] + prices[i] );
// cout<<dp[i][j]<<' ';
}
// cout<<endl;
}
return dp[prices.size()-1][k*2];
}
};
二刷
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
vector<vector<int>> dp(prices.size() , vector<int>(k*2+1));
for(int i=0 ; i<(k*2+1) ;i++)
if(i%2 == 1) dp[0][i] = -prices[0];
for(int i=1 ; i<prices.size() ;i++)
{
for(int j=1 ; j<(k*2+1) ;j++)
{
if(j%2==1) dp[i][j] = max(dp[i-1][j] , dp[i-1][j-1] - prices[i] );
else dp[i][j] = max(dp[i-1][j] , dp[i-1][j-1] + prices[i] );
}
}
return dp[prices.size()-1][k*2];
}
};
相关文章
- Leetcode: LRU Cache
- LeetCode高频题:如何不用int转字符数组,实现int类型数字x的第L位和R位数字交换
- JS Leetcode 213. 打家劫舍 II 题解分析,在动态规划基础上感受分治算法的魅力
- [LeetCode] Find Peak Element
- [LeetCode] Sum Root to Leaf Numbers
- [LeetCode] Word Ladder
- [LeetCode] Binary Tree Level Order Traversal II
- [LeetCode]剑指 Offer 64. 求1+2+…+n
- 171、【动态规划】leetcode ——309. 最佳买卖股票时机含冷冻期 (C++版本)
- 170、【动态规划】leetcode ——188. 买卖股票的最佳时机 IV:二维数组+一维数组 (C++版本)
- 168、【动态规划】leetcode ——121. 买卖股票的最佳时机:dp数组+变量优化 (C++版本)
- leetcode第269场周赛记录
- 【LeetCode】216. Combination Sum III
- [LeetCode] 1008. Construct Binary Search Tree from Preorder Traversal 从先序遍历重建二叉搜索树
- [LeetCode] 933. Number of Recent Calls 最近的调用次数
- [LeetCode] Best Time to Buy and Sell Stock with Transaction Fee 买股票的最佳时间含交易费
- [LeetCode] Complex Number Multiplication 复数相乘
- [LeetCode] Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
- [LeetCode] Best Time to Buy and Sell Stock II 买股票的最佳时间之二
- [LeetCode] 132. Palindrome Partitioning II 拆分回文串之二
- leetcode 121 Best Time to Buy and Sell Stock 买卖股票的最佳时机(简单)
- leetcode算法121.买卖股票的最好时机
- leetcode算法69.x 的平方根