Poj百练 1163:The Triangle (分类:动态规划)

这道题可以说是入门动态规划的一道基础题了。仔细分析就可以得出算法。

题中还可以使用滚动数组来减少空间复杂度,因为只用到了maxSum数组度最后一行。但这里因为时间复杂度不变,所以没有改写。

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

short int tri[110][110];
int maxSum[110][110];//本题采用记忆性递归,避免重复计算
int N;

int main()
{
    cin >> N;
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= i; j++)
            cin >> tri[i][j];

    //对每行第一列做特殊处理
    maxSum[1][1] = tri[1][1];
    for(int i = 2; i < N; i++)
        maxSum[i][1] = tri[i][1] + maxSum[i-1][1];

    for(int i = 2; i <= N; i++){
        //采用记忆性递归
        for(int j = 2; j <= i; j++){
            if(maxSum[i-1][j] > maxSum[i-1][j-1])
                maxSum[i][j] = maxSum[i-1][j] + tri[i][j];
            else
                maxSum[i][j] = maxSum[i-1][j-1] + tri[i][j];
        }
    }

    //输出最后一行中最大的maxSum
    int ans = 0;
    for(int i = 1; i <= N; i++){
        if(maxSum[N][i] > ans)
            ans = maxSum[N][i];
    }

    cout << ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/81155365