zoukankan      html  css  js  c++  java
  • 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];
        }
    };
  • 相关阅读:
    Bootstrap中的Dropdown悬停触发
    git常用命令整理
    ThinkPHP-项目模块分组后自定义类库文件放去哪?
    项目开发中常用的PHP实用代码算法
    1049. Counting Ones (30)
    1059. Prime Factors (25)
    1050. String Subtraction (20)
    观察者模式
    策略模式
    JVM剖析
  • 原文地址:https://www.cnblogs.com/CindyZJT/p/5626096.html
Copyright © 2011-2022 走看看