動態規劃初步 數字三角形(遞迴,遞推,數位化搜尋)

2021-08-07 04:20:51 字數 1419 閱讀 2812

題目:給出了乙個數字三角形,請編寫乙個程式,計算從頂至底的某處的一條路徑,使該路徑所經過的數字的總和最大。

(1)每一步可沿左斜線向下或右斜線向下

(2)1 < 三角形行數 < 100

(3)三角形數字為0,1,…99

輸入:

5

73 8

8 1 0

2 7 4 4

4 5 2 6 5

輸出:
34
思路:不斷的進行遞迴運算,找出左右子樹最大值,再帶入。
#include 

#include

using

namespace

std;

#define max 101

int d[max][max],a[max][max];

int n;

int maxsum(int i,int j)

int main()

}printf("%d\n",maxsum(1,1));

return

0;}

思路:時間複雜度0(n^2),i是逆序列舉的,因此再計算d[i+1][j]前,它所需要的d[i+1][j]和d[i+1][j+1]一定已經算出來了。
#include 

#include

using

namespace

std;

#define max 101

int d[max][max],a[max][max];

int n;

int main()

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

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

}printf("%d\n",d[1][1]);

return

0;}

思路:保證每個節點只訪問一次,時間複雜度為o(n^2).
#include 

#include

using

namespace

std;

#define max 101

int d[max][max],a[max][max];

int n;

int maxsum(int i,int j)

else

return d[i][j];

}int main()

}memset(d,-1,sizeof(d));

printf("%d\n",maxsum(1,1));

return

0;}

動態規劃初步 數字三角形

問題描述 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外每個數的左下方和右下方各有乙個數。從第一行的數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數全部加起來,如何走才能使得這個和盡量大 若熟悉回溯法,會發現這是個動態的決策問題 每次有兩種選擇 左下或右下。若用回溯...

動態規劃初步 數字三角形

從上往下求和,求最大和的路徑.3 2 4 10 1 分析 從下向上求和 附 和執行結果 遞推計算和遞迴求和,它們都會把前一步的計算結果儲存下來 樹 好吧我蛋疼了.這裡面用佇列來逐層build和print.這個才更像重點 v typedef struct node node node root nod...

數字三角形 動態規劃與遞迴

問題描述 73 8 8 1 0 2 7 4 4 4 5 2 6 5 上圖給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路 徑,把路徑上面的數加起來可以得到乙個和,和最大的路徑稱為最佳路徑。你的任務就是求 出最佳路徑上的數字之和。注意 路徑上的每一步只能從乙個數走到下一層上和它...