51Nod 1002 數塔取數問題

2021-08-01 21:48:47 字數 888 閱讀 1335

因為5-31晚停電,所以6-1補上

乙個高度為n的由正整數組成的三角形,從上走到下,求經過的數字和的最大值。

每次只能走到下一層相鄰的數上,例如從第3層的6向下走,只能走到第4層的2或9上。

5 8 4

3 6 9

7 2 9 5

例子中的最優方案是:5 + 8 + 6 + 9 = 28

input

第1行:n,n為數塔的高度。(2 <= n <= 500)

第2 - n + 1行:每行包括1層數塔的數字,第2行1個數,第3行2個數……第k+1行k個數。數與數之間用空格分隔(0 <= a[i] <= 10^5) 。

output

輸出最大值

input示例

4 5

8 4

3 6 9

7 2 9 5

output示例

28本題一開始可能會想到直接dfs 搜尋,但是這樣時間複雜度偏高。乙個聰明一點的想法是利用動態規劃的思想,從最後一層開始向上,因為每次有兩種路徑選擇(直下方數字和斜下方數字),那麼每次取得這兩種情況中數字較大的那種情況… 一直到第一層,就是答案。**:

#include 

using

namespace

std;

int a[510][510];

int res[510];

int main() }}

// 從倒數第二層開始一直到第一層:

for(int i = n-2; i >= 0; i--)

}// 到最後第一層的數字就是答案

cout

<< res[0] << endl;

return

0;}

51 nod 1002 數塔取數問題

思路 這是一道典型的動態規劃問題。最簡單的dp 考慮從底層的結點開始計算。假定從上往下的層數記為 1 n 第i層走到第i 1層取決於 第i 1層結點的最大值。具體實現時 用乙個一維陣列儲存從底往上的結果,可以減小空間複雜度。注 本文給出的演算法時間複雜度 o n include include in...

51nod 1002 數塔取數問題

1002 數塔取數問題 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 乙個高度為n的由正整數組成的三角形,從上走到下,求經過的數字和的最大值。每次只能走到下一層相鄰的數上,例如從第3層的6向下走,只能走到第4層的2或9上。5 8 4 3 6 9 7 2 9 5 例...

51nod 1002 數塔取數問題

1002 數塔取數問題 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 收藏關注乙個高度為n的由正整數組成的三角形,從上走到下,求經過的數字和的最大值。每次只能走到下一層相鄰的數上,例如從第3層的6向下走,只能走到第4層的2或9上。58 4 3 6 9 7 2 9 ...