POJ 1163 The Triangle

题目大意: 从三角形顶部数字走,每次只能走到这个数字的左下角或者右下角的数字,直到底部,计算走过的线路的数字之和,求这个和的最大值

解题思路: 这道题如果用枚举法(暴力思想),在数塔层数稍大的情况下(如31),则需要列举出的路径条数将是一个非常庞大的数目(2^30= 1024^3 > 10^9=10亿)。
因此我们可以从下往上推,相邻的两个数中找较大的与上层相加,得出的结果相邻的两个数中再找较大的与上层相加,以此类推。

#include <cstdio>
#include <algorithm>
using namespace std;

int main() {
    int N;
    while (scanf("%d", &N) != EOF) {
        int DP[110][110];
        for (int i = 0; i < N; i++)
            for (int j = 0; j <= i; j++)
                scanf("%d", &DP[i][j]);
        for (int i = N-2; i >= 0; i--)
            for (int j = 0; j <= i; j++)
                DP[i][j] += max(DP[i+1][j], DP[i+1][j+1]);

        printf("%d\n", DP[0][0]);
    }
    return 0;
}

你可能感兴趣的:(POJ 1163 The Triangle)