买卖股票的最佳时机

 

思路分析 : 

dp[i][j][0] 表示到第 i 天,交易了 k 支股票,并且手上未持股的最大收益

dp[i][j][1] 表示到第 j 天,交易了 k 支股票,并且手上持股的最大收益

代码分析 :

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int dp[1005][105][2];
        memset(dp, 0, sizeof(dp));
        int n = prices.size();
        dp[0][0][0] = 0; dp[0][0][1] = -999999;
        // printf("n = %d \n", n);
        prices.push_back(0);
        for(int i = n; i > 0; i--) prices[i] = prices[i-1];
        for(int i = 1; i <= n; i++) {
            dp[i][0][0] = 0;
            dp[i][0][1] = max(-prices[i], dp[i-1][0][1]);
        } 
        for(int i = 1; i <= k; i++) dp[0][i][0] = dp[0][i][1] = -9999999;

        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= k; j++){
                dp[i][j][0] = max(dp[i-1][j-1][1]+prices[i], dp[i-1][j][0]);
                dp[i][j][1] = max(dp[i-1][j][0]-prices[i], dp[i-1][j][1]); 
            }
        }
    
        int ans = 0;
        for(int i = 1; i <= k; i++){
            ans = max(ans, dp[n][i][0]);
            // ans = max(ans, dp[n][i][1]);
        }
        return ans;
    }
};

  

 

posted @ 2021-11-10 21:21  楼主好菜啊  阅读(54)  评论(0编辑  收藏  举报