力扣:188.买卖股票的最佳时机IV

力扣:188.买卖股票的最佳时机IV

题目:
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

解析类似
j的状态表示为:

0 表示不操作
1 第一次买入
2 第一次卖出
3 第二次买入
4 第二次卖出

大家应该发现规律了吧 ,除了0以外,偶数就是卖出,奇数就是买入。

自写代码不过:
1~k为第j次买入股票
k+1~2*k为第 j 次卖出股票
为什么错了呢?当前天买入股票要引用前些天卖出的股票,但是你知道前些天卖出的股票吗?不知道因为还没有遍历,所以这种遍历方式是错的。
应该奇数为买入股票偶数为卖出股票才对

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        if(prices.size() == 0) return 0;
        vector<vector<int>>dp(prices.size(),vector<int>(2*k+1,0));
        for(int i = 1; i <= k; ++i){
            dp[0][i] = -prices[0];
        }
        for(int i = 1; i < prices.size(); ++i){
            for(int j = 1; j <= k; ++j){
                dp[i][j] = max(dp[i-1][k+j-1]-prices[i],dp[i-1][j]);
            }
            for(int j = k+1; j <= 2*k; ++j){
                dp[i][j] = max(dp[i-1][j-k]+prices[i],dp[i-1][j]);
            }
            
        }
        return dp[prices.size()-1][2*k];
    }
};

正确代码:

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        if (prices.size() == 0) return 0;
        vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));
        for (int j = 1; j < 2 * k; j += 2) {
            dp[0][j] = -prices[0];
        }
        for (int i = 1;i < prices.size(); i++) {
            for (int j = 0; j < 2 * k - 1; j += 2) {
                dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
                dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
            }
        }
        return dp[prices.size() - 1][2 * k];
    }
};

你可能感兴趣的:(动态规划,leetcode,算法,职场和发展)