給定乙個如下圖所示的數字三角形,從頂部出發,在每一結點可以選擇移動至其左下方的結點或移動至其右下方的結點,一直走到底層,要求找出一條路徑,使路徑上的數字的和最大。(下面排列看起來可能有點不準確)
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
借用最簡單的動態規劃的思想來考慮的話,解法其實相當簡單,根據以下**即可看懂思路:
#includeusing namespace std;
const int n = 505, inf = - 5e6 - 5;
int n, a[n][n], f[n][n];
int main()
然而以上卻是採用的二維陣列來處理的問題,其實可以轉化為一維陣列來解決問題,但是思路描述上又變得不好理解了。這時突然想到之前揹包問題中二維陣列轉化為一維陣列好像都是固定的思路模板。
一維陣列方案解決**如下:
#includeusing namespace std;
const int n = 510, inf = -1e9;
int a[n][n];
int f[n];
int n, m;
int main()
仔細對比兩套**中核心處的狀態轉移計算處的**:
for(int i = 2; i <= n; i ++)
for(int j = 1; j <= i; j ++)
f[i][j] = max(f[i - 1][j], f[i - 1][j - 1]) + a[i][j];
for (int i = 2; i <= n; i ++)
for (int j = i; j >= 1; j --)
f[j] = max(f[j] + a[i][j], f[j - 1] + a[i][j]);
這兩組**其實可以認為是等效的,具體分析起來確實挺頭禿的,就先這樣當板子記了。 數字三角形
題目描述 示出了乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 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 ...