買賣股票的最佳時機3

題目描述:
在這裏插入圖片描述
思路:
首先需要列舉所有的狀態。此題共有三個狀態:天數,交易次數,持有或不持有
那麼接下來需要做的就是列舉所有的狀態,並且在每種狀態下做出不同的決策。
具體細節可參考一題解決股票系列問題

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];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章