思路:
和上一道题区别在于,只能进行2次交易变为k次交易
变成for循环即可
储备:
问题重点:
1、
注意k笔交易是k次买入+k次卖出
故应为2*k次
2、
注意初始化的第一次买入和后面的第一次买入不一样。因为初始化固定为-prices[0],而后面会更新故是-prices[i]
保证只买卖一次的话就一直是-price[i]。所以条件删掉也行
最后:
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int n=prices.size();
vector<vector<int>> dp(n+1,vector<int>(2*k+1));
for (int j=1;j<=2*k;j++) {
if (j%2)
dp[0][j]=-prices[0];//奇数是买入了。偶数是又卖出了相当于没操作
}
for (int i=1;i<n;i++) {
for (int j=1;j<=2*k;j++) {
// if (j==1) {//第一次一定是这样.初始化只保证了第0天。所以这样
// dp[i][j]=max(dp[i-1][j],-prices[i]);//保证一定是第一次买入
// }
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]);//偶数卖出,加上
}
}
//1是第一次买入,2是第一次卖出,3是第二次买入,4是第二次卖出...
//类推得到奇数是买入,偶数是卖出。
return dp[n-1][2*k];
}
};
条件删掉也行。
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int n=prices.size();
vector<vector<int>> dp(n+1,vector<int>(2*k+1));
for (int j=1;j<=2*k;j++) {
if (j%2)
dp[0][j]=-prices[0];//奇数是买入了。偶数是又卖出了相当于没操作
}
for (int i=1;i<n;i++) {
for (int j=1;j<=2*k;j++) {
if (j==1) {//第一次一定是这样.初始化只保证了第0天。所以这样
dp[i][j]=max(dp[i-1][j],-prices[i]);//保证一定是第一次买入
}
else 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]);//偶数卖出,加上
}
}
//1是第一次买入,2是第一次卖出,3是第二次买入,4是第二次卖出...
//类推得到奇数是买入,偶数是卖出。
return dp[n-1][2*k];
}
};


被折叠的 条评论
为什么被折叠?



