JSK-243 三角形的路徑權【動態規劃】
阿新 • • 發佈:2018-12-10
示出了一個數字三角形。 請編一個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。
每一步可沿左斜線向下或右斜線向下走;
1< 三角形行數< 25;
三角形中的數字為整數< 1000;
輸入第一行為N,表示有N行 後面N行表示三角形每條路的路徑權
輸出路徑所經過的數字的總和最大的答案
樣例輸入
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
樣例輸出
30
問題描述:(略)
問題分析:
這是一個動態規劃問題,有兩種解法。
方法一:
不使用額外陣列,從頂向下計算。
方法二:
使用額外陣列,從底向上計算。需要注意陣列大小!要多一行和一列保證可靠。
程式說明:(略)
參考連結:(略)
題記:動態規劃演算法的計算速度往往是快的。
AC的C語言程式如下:
AC的C語言程式如下:
/* JSK-243 三角形的路徑權 */ #include <stdio.h> #include <string.h> #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #define N 25 int a[N][N]; int solve(int n) { for(int i=1; i<n; i++) for(int j=0; j<=i; j++) if(j == 0) a[i][j] += a[i-1][j]; else a[i][j] = MAX(a[i][j] + a[i-1][j-1], a[i][j] + a[i-1][j]); int ans = 0; for(int i=n-1, j=0; j<n; j++) if(a[i][j] > ans) ans = a[i][j]; return ans; } int main() { int n; while(scanf("%d", &n) != EOF) { memset(a, 0, sizeof(a)); for(int i=0; i<n; i++) for(int j=0; j<=i; j++) scanf("%d", &a[i][j]); int ans = solve(n); printf("%d\n", ans); } return 0; }