传送门

题目大意就是在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大,首先想到的可能是递归求解,但是题目的数据规模比较大,递归计算的话存在很多的重复运算,时间复杂度是

POJ 1163 The Triangle(动态规划入门)_#include

,当

POJ 1163 The Triangle(动态规划入门)_i++_02

行时,肯定超时,。如果每算出一个

POJ 1163 The Triangle(动态规划入门)_#include_03

就保存起来,下次用到其值的时候直接取用,则可免去重复计算。那么可以用

POJ 1163 The Triangle(动态规划入门)_动态规划_04

时间完成计算。因为三角形的数字总数是

POJ 1163 The Triangle(动态规划入门)_i++_05


还有更好的方法就是递推:从底部向顶部递推,用一个数组记录最大值,然后顶部那个就是满足题意的最优解,代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n,a[110][110],maxn[110][110];
    cin >> n;
    for(int i = 1;i <= n; i++)
    {
        for(int j = 1;j <= i; j++)
            scanf("%d",&a[i][j]);
    }
    for(int i = 1;i <= n; i++)
        maxn[n][i] = a[n][i];
    for(int i = n - 1; i > 0; i--)
    {
        for(int j = 1;j <= i; j++)
            maxn[i][j] = max(maxn[i + 1][j],maxn[i + 1][j + 1]) + a[i][j];
    }
    cout << maxn[1][1] << endl;
}