题目描述
考虑在下面被显示的数字金字塔。
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。
每一步可以走到左下方的点也可以到达右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入
第一个行包含 R(1<= R<=1000) ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
输出
单独的一行包含那个可能得到的最大的和。
样例输入
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
样例输出
30
其实这道题本身很简单
方法:
还是记忆化dg,在返回时顺便记录下
还是那句话:上代码!!!
#include<bits/stdc++.h>
using namespace std;
int n,a[1001][1001],f[1001][1001],ans;
int dg(int x,int y)
{
if(x==n-1)
return a[x][y];
else
{
if(f[x+1][y]==-1&&f[x+1][y+1]==-1)
{
f[x][y]=a[x][y]+max(dg(x+1,y),dg(x+1,y+1));
return f[x][y];
}
if(f[x+1][y]!=-1&&f[x+1][y+1]==-1)
{
f[x][y]=a[x][y]+max(f[x+1][y],dg(x+1,y+1));
return f[x][y];
}
if(f[x+1][y]==-1&&f[x+1][y+1]!=-1)
{
f[x][y]=a[x][y]+max(dg(x+1,y),f[x+1][y+1]);
return f[x][y];
}
if(f[x+1][y]!=-1&&f[x+1][y+1]!=-1)
{
f[x][y]=a[x][y]+max(f[x+1][y],f[x+1][y+1]);
return f[x][y];
}
}
}
main()
{
freopen("numtri.in","r",stdin);
freopen("numtri.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
scanf("%d",&a[i][j]);
f[i][j]=-1;
}
}
printf("%d",dg(0,0));
}