Openjduge 1021 數字三角形 dp

2021-10-09 23:07:54 字數 1769 閱讀 6834

總時間限制: 1000ms 記憶體限制: 65536kb

738

8102

7444

5265

給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。

輸入的是一行是乙個整數n (1 < n <= 100),給出三角形的行數。下面的n行給出數字三角形。數字三角形上的數的範圍都在0和100之間。

輸出最大的和。

樣例輸入

573

8810

2744

4526

5

樣例輸出

30
//遞迴解 

#include

using

namespace std;

const

int n =

101;

int map_[n]

[n], n;

intmax_sum

(int i,

int j)

int main (

)

為什麼超時

答案:大量重複計算

7(1) 1

3(1) 8(1) 2

8(1) 1(2) 0(1) 4

2(1) 7(3) 4(3) 4(1) 8

4(1) 5(4) 2(6) 6(4) 5(1) 16

如果採用遞迴方法,深度遍歷每條路徑存在大量重複計算。底行時間複雜度2n-1,總時間複雜度2n,對於n=100行時,肯定超時。

改進

如果每算出乙個max_sum(r,j)就儲存起來,下次用

到其值的時候直接取用,則可免去重複計算。那麼

可以用o(n2)時間完成計算。因為三角形的數字總

數是n(n+1)/2.

#include

using

namespace std;

const

int n =

101;

int map_[n]

[n], maxsum[n]

[n], n;

intmax_sum

(int i,

int j)

return maxsum[i]

[j];

}int main (

)printf

("%d"

,max_sum(1

,1))

;return0;

}

#include

using

namespace std;

const

int n =

101;

int map_[n]

[n], maxsum[n]

[n], n;

int main (

)

#include

using

namespace std;

const

int n =

101;

int map_[n]

[n], n;

int*maxsum;

int main (

)

數字三角形

題目描述 示出了乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 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 ...