1. 程式人生 > >JSK-243 三角形的路徑權【動態規劃】

JSK-243 三角形的路徑權【動態規劃】

示出了一個數字三角形。  請編一個程式計算從頂至底的某處的一條路 徑,使該路徑所經過的數字的總和最大。  

每一步可沿左斜線向下或右斜線向下走; 

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;
}