题目链接:https://cn.vjudge.net/problem/OpenJ_Bailian-2760
思路:最容易想到的是基本的递推,但是会严重超时 ,正确方法看代码、
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 105;
int a[MAXN][MAXN];
int MaxAns[MAXN][MAXN];
int GetMax(int x,int y)
{
if(MaxAns[x][y] != -1)
return MaxAns[x][y];
if(x == MAXN)
MaxAns[x][y] = a[x][y];
else
MaxAns[x][y] = max(GetMax(x+1,y),GetMax(x+1,y+1))+a[x][y];
return MaxAns[x][y];
}
int main()
{
int N;
cin >> N;
for(int i=1;i<=N;i++)
for(int j=1;j<=i;j++) {
cin >> a[i][j];
MaxAns[i][j] = -1;
}
/* 记忆化递归
cout << GetMax(1,1) << endl;
*/
// 递推
for(int j=1;j<=N;j++)
MaxAns[N][j] = a[N][j];
for(int i=N-1;i>=1;i--)
for(int j=1;i<=i;j++)
MaxAns[i][j] = max(MaxAns[i+1][j],MaxAns[i+1][j+1]);
cout << MaxAns[1][1] << endl;
}