leetcode—Best Time to Buy and Sell Stock IV

题目:

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most k transactions.

You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

分析:

该题采用动态规划的方法。

会想到:第i天进行第j次交易的最大收益为①第i-1天进行第j次交易的最大收益②第i-1天进行j-1此交易与第i天进行交易的和 中的较大值。

于是,得到方程:

profit[i][j] = max(profit[i – 1][j], profit[i – 1][j – 1] + diff)

 其中,

 diff=prices[i]-prices[i-1] 。

然而,这种计算方法存在一些问题:第i天的交易可与之前的交易合为一次交易。这样,j的值就减小了1。

于是,重新规划:

temp[i][j] = max ( profit[i-1][j-1]+max(diff,0),temp[i-1][j]+diff)

profit[i][j] = max(profit[i-1][j],temp[i][j]

练习代码:

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

提交后,一直runtime error

于是,将二维vector降维:用一维向量记录到达第i天时的temp最优解和profit最优解。

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        if ( n <= 1 )   return 0;
        if ( k <= 0 )   return 0;
        if ( k >= n) {
            int res = 0;
            for(int i = 1; i < n; i++ ){
                if(prices[i] > prices[i-1]) 
                    res += prices[i]-prices[i-1];
            }
            return res;
        }
        int diff;
        vector<int> temp(k+1,0);
        vector<int> profit(k+1,0);
        
        for(int i = 2; i <= n; i++ ) {
            diff = prices[i-1] - prices[i-2];
            profit[0] = 0;
            temp[0] = 0;
            for(int j = 1; j <= k; j++ ) {
                temp[j] = max(profit[j-1],temp[j]+diff);
                profit[j] = max(temp[j],profit[j]);
            }
        }
        return profit[k];
    }
};
原文地址:https://www.cnblogs.com/CindyZJT/p/5626096.html