1. 程式人生 > 其它 >2760:數字三角形,考點:動規,人人為我型遞推

2760:數字三角形,考點:動規,人人為我型遞推

原題:http://bailian.openjudge.cn/practice/2760/

描述

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

注意:路徑上的每一步只能從一個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。

輸入

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

輸出

輸出最大的和。

樣例輸入

5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

樣例輸出

30 

解法

思路:從最後一行向上推

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 int N;
 6 int Tri[105][105];
 7 int main()
 8 {
 9     cin >> N;
10     for (int i = 1; i <= N; i++) {
11         for (int j = 1; j <= i; j++)
12             cin >> Tri[i][j];
13 } 14 for (int i = N - 1; i >= 1; i--) 15 for (int j = 1; j <= i; j++) 16 { 17 Tri[i][j] += max(Tri[i + 1][j], Tri[i + 1][j + 1]); 18 } 19 cout << Tri[1][1] << endl; 20 return 0; 21 }

老師的更優解法:節省空間,只用存下一行

 1 #include <iostream>
 2
#include <algorithm> 3 using namespace std; 4 #define MAX 101 5 int D[MAX][MAX]; 6 int n; int * maxSum; 7 int main() { 8 int i, j; 9 cin >> n; 10 for (i = 1; i <= n; i++) 11 for (j = 1; j <= i; j++) 12 cin >> D[i][j]; 13 maxSum = D[n]; //maxSum 指向第n 行 14 for (int i = n - 1; i >= 1; --i) 15 for (int j = 1; j <= i; ++j) 16 maxSum[j] = max(maxSum[j], maxSum[j + 1]) + D[i][j]; 17 cout << maxSum[1] << endl; 18 }