麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

動態規劃之數字三角形

2019-11-11 04:50:09
字體:
來源:轉載
供稿:網友

數字三角形 

有一個由非負整數組成的三角形,第一行只有一個數,除了最下行之外每個數的左下方和右下方各有一個數。

                   1

                2     3

           4       5       6

     7         8      9        10

從第一行數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數全部加起來。如何才能使得這個和盡量大?

一個n層數字三角形的完整路線有2^(n-1)條,當n很大時再一個個去求會很麻煩,為了得到高效的算法,需要用抽象的方法思考問題:把當前的位置(i,j)看做一個狀態,然后定義狀態(i,j)的指標函數d(i,j)為從格子(i,j)出發時能得到的最大和(包括(i,j)本身的值),在這個狀態定義下,原問題的解是d(0,0)。

于是得到狀態轉移方程

d(i,j)=a(i.j)+max{d(i+1,j),d(i+1,j+1)}

動態規劃的核心是狀態和狀態轉移方程。

記憶化搜索和遞推

方法一:遞歸計算

int solve(int i,int j)

{

    return  a[i][j] + (i==n ? : max( solve(i+1,j),solve(i+1,j+1) );

}

這樣做是正確的,但是時間效率太低,其原因在于重復計算。

方法二:遞推計算。

int i , j;

for(j = 1;j <= n;j++) d[n][j] = a[n][j];

for(i = n-1;i >= 1;i--)

     for(j =1 ;j<=i;j++)

          d[i][j] = a[i][j]+ max(d[i+1][j],d[i+1][j+1]);

程序的時間復雜度為 O(n^2),但為什么可以這樣計算呢?,原因在于i是逆序枚舉的,在計算d[i][j]時它所需要的d[i+1][j],d[i+1][j+1]已經計算出來了。

方法三:記憶化搜索。

程序分為兩部分,首先用“memset”把d全部初始化為-1,然后編寫遞歸函數:

int solve(int i,int j)

{

      if(d[i][j]>=0)   return d[i][j];

return a[i][j] + (i==n ? : max( solve(i+1,j),solve(i+1,j+1) );

上述程序依然是遞歸的,但同時也把計算結果保存在數組d中。題目中說各個數都是肺腑的,因此如果已經計算過某個d[i][j],則它應是非負的。這樣,只需要把所有d初始化為-1,即可通過判斷是否d[i][j]>=0得知它是否已經被計算過。最后把它保存在d[i][j]中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 狠狠操天天射 | www.成人免费视频 | 3xxx| 91久久国产露脸精品国产护士 | 久草视频福利在线观看 | 水卜樱一区二区av | 一级做a爱片性色毛片高清 国产精品色在线网站 | 亚洲白嫩在线观看 | 久久久久久久久亚洲精品 | 日韩黄a | 成人勉费视频 | 国产精品www | 中文区永久区 | 羞羞草视频 | 一级黄色片在线看 | 日日夜av| 国产一级毛片国产 | 牛牛a级毛片在线播放 | 一级黄色免费观看 | 在线中文字幕亚洲 | 久在线观看福利视频69 | 视频二区国产 | 羞羞视频一区二区 | 免费观看三级毛片 | 日韩av电影免费在线观看 | 日美黄色片 | 色悠悠久久久久 | 国产成人在线观看免费网站 | 日韩毛片免费观看 | 精品国产91久久久久久久 | 法国性xxx精品hd专区 | 日本免费aaa观看 | 中文字幕亚洲一区二区三区 | 91av日韩| 欧美精品一区自拍a毛片在线视频 | 国产精品成aⅴ人片在线观看 | sm高h视频 | 欧美成人免费 | 免费在线看黄 | 欧美性受xxxxxx黑人xyx性爽 | 欧美人xx|