动态规划2

  现在有这样一个问题:数字三角形。由于三角形具有层数的概念,很显然的是对于这道题的一种解法是使用深搜:从上到下,进入每一层,遍历每一条路径然后求出答案,可是值得注意的是,三角形的层数太大了。

  现在我们换一个角度来思考,我们从三角形底层向上走。

  我们使用数组a[i][j]来保存每一个点上的数组,使用数组f[i][j]来记录从点(i, j)开始走,走到底层所能达到的最大数字和。对于非底层的每一个点f[i][j],它都有两个子节点f[i + 1][j]和f[i + 1][j + 1],我们只需要计算f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j],就可以获得从点(i, j)开始走,走到最底层所能达到的最大数字和。事实上,当整个三角形计算完毕后,根据数组f的定义,f[1][1]中所保存的数据就是我们要求的答案。

  实现代码如下:

  

#include <iostream>
#include <cstdio>
using namespace std;
int const MAXN = 1001;

int n;
int f[MAXN][MAXN];

int max(int x, int y) {
    return x > y ? x : y;
}

void calc() {
    for(int i = n - 1; i >= 1; i--) {
        for(int j = 1; j <= i; j++) {
            f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + f[i][j];
        }
    }
}

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= i; j++) {
            scanf("%d", &f[i][j]);
        }
    }
    calc();
    printf("%d\n", f[1][1]);
    return 0;
}

 

 

  圆满完成。

posted @ 2018-10-11 11:25  potato226  阅读(97)  评论(0编辑  收藏  举报