其實數字三角形網上的**無數,別人也講得很好,而且這個題的難度不大,但是這道題作為入門動態規劃和學習使用備忘錄以及遞迴到遞推的轉換真的很適合,而且我感覺畢竟自己寫的東西除了記憶更深刻以外,下次回顧的時候也就更加親切,過往的記憶很快被打通,所以我決定還是把自己寫的**再上傳上去,起到總結和複習的作用。
1按照思路可以寫出使用遞迴的**如下
1 #include2此時**的複雜度為2^n顯然需要改進using
namespace
std;
3int array[100][100];4
intn;
5int path[100]=;
6int f(int r,int
j)10
int num1=f(r+1
,j);
11int num2=f(r+1,j+1
);12
if(num1>num2)
15else18}
19int
main()
2028
}29 cout << f(0,0
);30
return0;
31 }
分析如下
2根據思路可知利用備忘錄演算法可以大大降低複雜度,**如下
1 #include23遞推法using
namespace
std;
3int array[100][100];4
intn;
5int path[100][100];//
用來表示該位置有沒有計算過,沒有就計算,有就直接使用
6int f(int r,int
j)10
if(path[r+1][j]==-1)13
if(path[r+1][j+1]==-1)16
if(path[r+1][j]>path[r+1][j+1
])19
else22}
23int
main()
2431}32
for(int i=0;i)36}
37 cout << f(0,0
);38
return0;
39 }
從底向上遞推,出最後一行外,每一行的每個點的最大值等於自身加上下面一行對應左右兩個點的最大值,從下往上遞推,最頂部的即所求。比如下圖所示。首先最後一行的最大值就是它本身。倒數第二行第乙個數7就是輸入的倒二行的第乙個數2 + 4 和 2 +5 取最大值 。逐步遞推到頂部。
4使用遞推法並列印路徑
即
等價於
**如下
1 #include2執行結果截圖using
namespace
std;
3int array[100][100];4
int array1[100][100];5
intmain()616
}17for(int i=n-2;i>=0;i--)24}
25}26 cout << array[0][0] <
27 cout << "
路徑為:
"<
28 cout << array1[0][0]<< "
--->";
29int u1=0;30
int u2=0;31
32for(int i=u1;i1;i++)
39else44}
45}46 cout << "結束"
;47return0;
48 }
遞推時間複雜度要優於遞迴
數字三角形
題目描述 示出了乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 25 三角形中的數字為整數 1000 輸入第一行為n,表示有n行 後面n行表示三角形每條路的路徑權 輸出路徑所經過的數字的總和最大的答案 樣...
數字三角形
description 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?input 輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整數n 1 n 100 表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,...
數字三角形
3 8 8 1 0 2 7 4 4 4 5 2 6 5 上圖給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,和最大的路徑稱為最佳路徑。你的任務就是求出最佳路徑上的數字之和。input 1 5 7 3 8 8 1 0 2 7 4 4 4 ...