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