題目描述:
思路:
首先需要列舉所有的狀態。此題共有三個狀態:天數,交易次數,持有或不持有
那麼接下來需要做的就是列舉所有的狀態,並且在每種狀態下做出不同的決策。
具體細節可參考一題解決股票系列問題
for 狀態1 in 狀態1所有取值:
for 狀態2 in 狀態2所有取值:
...#如果還有更多狀態的話,再依次列舉即可
dp[狀態1][狀態2][...]=最優(決策1,決策2,...)
這裏具體說一下base case的情況
申請一個三維數組dp[n+1][k+1][2]
dp[0][k][0]=0 表示交易的第0天,最多進行了k次交易,並且不持有股票的最大收益是0
dp[0][k][1]=INT_MIN 表示交易的第0天,最多進行k次交易,並且持有股票,用INT_MIN表示不可能的情況
dp[i][0][0]=0 表示交易的第i天,最多進行了0次交易,並且不持有股票的最大收益是0
dp[i][0][1]=INT_MIN 表設計交易的第i天,最多進行了0次交易,並且持有股票的最大收益是不可能的情況
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.empty())
return 0;
int n=prices.size();
int dp[n+1][3][2];
for(int i=0;i<=n;i++){
for(int k=0;k<=2;k++){
if(i==0){
dp[i][k][0]=0;
dp[i][k][1]=INT_MIN;
continue;
}
if(k==0){
dp[i][k][0]=0;
dp[i][k][1]=INT_MIN;
continue;
}
dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+prices[i-1]);
dp[i][k][1]=max(dp[i-1][k][1],dp[i-1][k-1][0]-prices[i-1]);
}
}
return dp[n][2][0];
}
};