java - 为什么leetcode的这个题是一个动态规划?
PHPz
PHPz 2017-04-18 09:45:25
0
1
396

leetcode地址: https://leetcode.com/problems...

我对这个算法慢慢的还是可以想通的, 但是为什么他是动态规划呢? 动态规划不是要话分子问题, 列出递推方程的吗?但是这个题并不能列出递推方程的...还是说我思考的方式不对. 望指点一下这个算法的思想

public class BestTimeToBuyAndSellStockIII
{
    public int maxProfit(int[] prices)
    {
        if(prices.length == 0) return 0;
        int ans = 0;
        int n = prices.length;

        //正向遍历,opt[i]表示 prices[0...i]内做一次交易的最大收益.
        int opt[] = new int[n];
        opt[0] = 0;
        int low = prices[0];
        int curAns = 0;
        for(int i = 1; i < n; i++)
        {
            if(prices[i] < low)
                low = prices[i];
            else if(curAns < prices[i] - low)
                curAns = prices[i] - low;
            opt[i] = curAns;
        }

        //逆向遍历, opt[i]表示 prices[i...n-1]内做一次交易的最大收益.
        int optReverse[] = new int[n];
        optReverse[n - 1] = 0;
        curAns = 0;
        int high = prices[n - 1];
        for(int i = n - 2; i >= 0; i--)
        {
            if(prices[i] > high) high = prices[i];
            else if(curAns < high - prices[i]) curAns = high - prices[i];
            optReverse[i] = curAns;
        }

        //再进行划分,分别计算两个部分
        for(int i = 0; i < n; i++)
        {
            int tmp = opt[i] + optReverse[i];
            if(ans < tmp) ans = tmp;
        }
        return ans;
    }
}
PHPz
PHPz

学习是最好的投资!

全員に返信(1)
Peter_Zhu

この問題は、まず順方向トラバーサルと逆方向トラバーサルの 2 つの問題に分解されます。
このステップは動的プログラミングとみなされるべきではありません。

しかし、2 つの小さな問題は内部で動的計画法アルゴリズムを使用しています。
すべての小さなステップは再帰的な定義です。つまり、過去 K 日間の最良の取引方法を知り、K+1 日の価格を加算したときに最適な取引方法は何であるかということです。
K は 0 から N まで上昇することが知られているため、過去 N 日間の最適な取引方法が得られます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!