36.188.买卖股票的最佳时机IV

思路:

和上一道题区别在于,只能进行2次交易变为k次交易

变成for循环即可

储备:

代码随想录

问题重点:

1、

注意k笔交易是k次买入+k次卖出

故应为2*k次

2、

注意初始化的第一次买入和后面的第一次买入不一样。因为初始化固定为-prices[0],而后面会更新故是-prices[i]

保证只买卖一次的话就一直是-price[i]。所以条件删掉也行

最后:

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n=prices.size();
        vector<vector<int>> dp(n+1,vector<int>(2*k+1));

        for (int j=1;j<=2*k;j++) {
            if (j%2)
                dp[0][j]=-prices[0];//奇数是买入了。偶数是又卖出了相当于没操作
        }

        for (int i=1;i<n;i++) {
            for (int j=1;j<=2*k;j++) {
                // if (j==1) {//第一次一定是这样.初始化只保证了第0天。所以这样
                //     dp[i][j]=max(dp[i-1][j],-prices[i]);//保证一定是第一次买入
                // }
                if (j%2==1) dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);//奇数买入,减去
                else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+prices[i]);//偶数卖出,加上
                
            }
        }
        //1是第一次买入,2是第一次卖出,3是第二次买入,4是第二次卖出...
        //类推得到奇数是买入,偶数是卖出。
        return dp[n-1][2*k];
    }
};

条件删掉也行。 

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n=prices.size();
        vector<vector<int>> dp(n+1,vector<int>(2*k+1));

        for (int j=1;j<=2*k;j++) {
            if (j%2)
                dp[0][j]=-prices[0];//奇数是买入了。偶数是又卖出了相当于没操作
        }

        for (int i=1;i<n;i++) {
            for (int j=1;j<=2*k;j++) {
                if (j==1) {//第一次一定是这样.初始化只保证了第0天。所以这样
                    dp[i][j]=max(dp[i-1][j],-prices[i]);//保证一定是第一次买入
                }
                else if (j%2==1) dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);//奇数买入,减去
                else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+prices[i]);//偶数卖出,加上
                
            }
        }
        //1是第一次买入,2是第一次卖出,3是第二次买入,4是第二次卖出...
        //类推得到奇数是买入,偶数是卖出。
        return dp[n-1][2*k];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值