先贴个题:
然后是我的代码:
#include<iostream>
#include<cstring>
#define MAX 1010
using namespace std;
int map[MAX][MAX],sumlist[MAX][MAX]; //储存金字塔数据和计算结果
int r;
int dp(int i,int j)
{
if(sumlist[i][j]!=-1) //如果这个点的最大值已被算过,则直接返回,不再计算
return sumlist[i][j];
if(i==r-1) //如果是金字塔最后一层,最大值就是本身的值
sumlist[i][j]=map[i][j];
else{
int x=dp(i+1,j);
int y=dp(i+1,j+1);
sumlist[i][j]=max(x,y)+map[i][j]; //递归逐层往上
}
return sumlist[i][j]; // 返回该点的累计最大值
}
int main()
{
cin>>r;
memset(map,0,sizeof(map)); //初始化金字塔数据
memset(sumlist,-1,sizeof(sumlist)) ; //初始化计算结果
for(int i=0;i<r;++i) //输入金字塔数据
for(int j=0;j<=i;++j)
cin>>map[i][j];
cout<<dp(0,0);
return 0;
}
总结下:简单的模板题,这题太经典了,没啥特别好说的,注意下递归的终止条件就好。
by————2023.11.17刷题记录