这道题可以说是入门动态规划的一道基础题了。仔细分析就可以得出算法。
题中还可以使用滚动数组来减少空间复杂度,因为只用到了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;
}