• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 70  文章 - 160  trackbacks - 0

            公告:
            知識共享許可協議
            本博客采用知識共享署名 2.5 中國大陸許可協議進行許可。本博客版權歸作者所有,歡迎轉載,但未經作者同意不得隨機刪除文章任何內容,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 具體操作方式可參考此處。如您有任何疑問或者授權方面的協商,請給我留言。

            常用鏈接

            留言簿(8)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 179896
            • 排名 - 147

            最新評論

            閱讀排行榜

            評論排行榜

            第十四章我想放在后面再看,先擱下。希望大家總結的一些文章也能向我推薦下,大家互相學習。

            首先,還是建議看看前言:http://m.shnenglu.com/tanky-woo/archive/2011/04/09/143794.html

            其次,阿門,感謝老天送給了我們這么一本圣經,看了這一章,再次感受到了《算法導論》分析問題的精辟,強悍的魅力。Orz, Orz,各種Orz。

            這一章講的是動態規劃,學算法的朋友,尤其是搞ACM的,對這個策略一定非常熟悉,所以這個算法網上的分析講解教程也是鋪天蓋地,大家可以多搜幾篇學習學習。

            動態規劃(Dynamic Programming,簡稱DP)是通過組合子問題的解來解決問題的。

            注意這里的programming不是指編程,而是指一種規劃

            因為DP用的太廣泛了,并且書上也花了很大的篇幅來講這一章,所以我也準備把這一章分幾篇來總結,并且我不按照書上的順序來總結,也不會全部用書上的例子。

            這一章首先給出一些基礎的概念,然后給出一個最基礎入門的DP問題,三角形求值問題。

            DP適用于子問題不是獨立的情況,這樣如果用分治法,也會作許多重復的工作,而DP只對子問題求解一次,將其結果保存在一張表中,從而避免了每次遇到各個子問題時重新計算的情況。

            比較分治法于動態規劃的區別:

            分治法:將問題劃分為一些獨立的子問題,遞歸的求解各子問題,然后合并子問題的解而得到原問題的解。

            eg.

            MERGE-SORT(A, p, r)
            1 if p < r
            2   then q ← |(p + r)/2|
            3        MERGE-SORT(A, p, q)
            4        MERGE-SORT(A, q + 1, r)
            5        MERGE(A, p, q, r)
            動態規劃適用于子問題不是獨立的情況,也就是各子問題包含公共的子子問題,鑒于會重復的求解各子問題,DP對每個問
            只求解一遍,將其保存在一張表中,從而避免重復計算。

            DP算法的設計可以分為四個步驟

            ①.描述最優解的結構。

            ②.遞歸定義最優解的值。

            ③.按自底而上的方式計算最優解的值。

            ④.由計算出的結果創造一個最優解。

            下面來看看三角形求值這個問題:

            將一個由N行數字組成的三角形,如圖所以,設計一個算法,計算出三角形的由頂至底的一條路徑,使該路徑經過的數字總和最大。

            sanjiaoxing

            這是在我見過的DP題目中,算是最簡單的了,我相信就算沒有學過DP的也會。

            將上圖轉化一下:

            sanjiaoxing2

            假設上圖用map[][]數組保存。

            令f[i][j]表示從頂點(1, 1)到頂點(i, j)的最大值。

            則可以得到狀態轉移方程:

            f[i][j] = max(f[i+1][j], f[i+1][j+1]) + map[i][j]

            此題既適合自頂而下的方法做,也適合自底而上的方法,

            當用自頂而下的方法做時,最后要在在最后一列數中找出最大值,

            而用自底而上的方法做時,f[1][1]即為最大值。

            所以我們將圖2根據狀態轉移方程可以得到圖3:

            sanjiaoxing3

            最大值是30.

            很簡單的DP題,代碼如下:

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            17
            18
            19
            20
            21
            22
            23
            24
            25
            26
            27
            28
            29
            30
            31
            32
            33
            34
            35
            36
            37
            38
            39
            40
            41
            42
            43
            44
            45
            46
            
            /*
            Author: Tanky Woo
            Blog:   www.WuTianQi.com
            Description: 動態規劃之三角形求值問題
            */
            #include <iostream>
            using namespace std;
             
            int map[6][6] = 
            {
            	{0, 0, 0, 0, 0, 0},
            	{0, 7, 0, 0, 0, 0},
            	{0, 3, 8, 0, 0, 0},
            	{0, 8, 1, 0, 0, 0},
            	{0, 2, 7, 4, 4, 0},
            	{0, 4, 5, 2, 6, 5}
            };
             
            int f[6][6];
             
            int _max(int a, int b)
            {
            	if(a >= b)
            		return a;
            	return b;
            }
             
            int main()
            {
            	memset(f, 0, sizeof(f));
            	for(int i=0; i<6; ++i)
            		f[5][i] = map[5][i];
            	for(int i=4; i>=1; --i)
            		for(int j=1; j<=i; ++j)
            			f[i][j] = _max(f[i+1][j], f[i+1][j+1]) + map[i][j];
            	for(int i=1; i<=5; ++i)
            	{
            		for(int j=1; j<=5; ++j)
            		{
            			cout.width(2);
            			cout << f[i][j] << " ";
            		}
            		cout << endl;
            	}
            	cout << f[1][1] << endl;
            }

            結果如圖:

            sanjiaoxing4

            下一篇會將裝配線的調度。

            在我獨立博客上的原文:http://www.wutianqi.com/?p=2484

            歡迎大家互相學習,互相進步!

            posted on 2011-05-20 07:27 Tanky Woo 閱讀(1743) 評論(0)  編輯 收藏 引用
            国产成人久久激情91| av无码久久久久不卡免费网站| 91亚洲国产成人久久精品网址| 精品久久久久一区二区三区| 日韩精品无码久久一区二区三| 亚洲精品无码久久久影院相关影片 | 国产精品久久久亚洲| 国产精品一区二区久久精品无码 | 久久久久久国产精品无码下载 | 亚洲乱码日产精品a级毛片久久| 久久无码专区国产精品发布| 中文字幕一区二区三区久久网站| 亚洲伊人久久综合中文成人网| 99久久精品免费国产大片| 亚洲精品乱码久久久久久自慰| 久久久久国色AV免费观看| 久久精品蜜芽亚洲国产AV| 亚洲午夜无码久久久久小说| 成人a毛片久久免费播放| 久久大香香蕉国产| 99久久免费国产精品特黄| 久久精品国产清自在天天线| 99久久精品国产高清一区二区| 久久人爽人人爽人人片AV | 国产午夜精品久久久久九九电影| 少妇久久久久久久久久| 久久久久亚洲av成人网人人软件| 久久精品无码一区二区日韩AV | 伊人久久无码精品中文字幕| 国产综合精品久久亚洲| 91精品国产91久久| 国产精品99久久久久久猫咪| 久久―日本道色综合久久| 久久久亚洲欧洲日产国码二区 | 伊人久久大香线蕉亚洲| 伊人久久亚洲综合影院| 久久婷婷午色综合夜啪| 亚洲中文字幕久久精品无码APP | 亚洲国产精品一区二区久久hs| 久久无码AV中文出轨人妻| 2020久久精品亚洲热综合一本|