决定从头重新系统的学一下DP,夯实基础,嗯,从简单开始。

【题目描述】

有一数字三角形,从顶部出发,在每一结点可以选择向左走或者向右走,一直走到底层。 要求找出一条路径,使路径上的值的和最大。

【题目链接】

CodeVS 1220

【解题思路】

用二维数组储存数字,记为a。 动态规划,设fi,j表示以(i,j)为起点所能获得的最大数字和。 转移: fi,j=max(fi+1,j,fi+1,j+1)+ai,j 边界: fn1,i=an1,i 计算顺序: 因为计算第i行时需要下一行i + 1的信息,故应倒序枚举行。

【AC代码】

#include <cstdio>
#include <algorithm>

#define MAXM 100
#define MAXN 100

int a[MAXM][MAXN];
int f[MAXM][MAXN];

int main(){
    int n;

    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        for(int j = 0; j <= i; j++){
            scanf("%d", a[i] + j);
        }
    }

    for(int i = 0; i < n; i++) f[n - 1][i] = a[n - 1][i];
    for(int i = n - 2; i >= 0; i--){
        for(int j = 0; j <= i; j++){
            f[i][j] = std::max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j];
        }
    }

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

就这样啦