原题:http://acm.nyist.net/JudgeOnline/problem.php?pid=171
好吧,这道题只是把数塔斜过来了,如果没做过数塔的话还是先把数塔怎么解决搞懂,之后再来做这道题。
首先可以想象把数塔三角形的顶点顺时针旋转成矩形的右下角,而数塔的高度则可以看成是行列的和再减一(想象不出来在纸上画下应该就能理解)
还有要注意的是运行到了后半段的时候数塔就不再是以前的情况,因为边缘会变得越来越窄,所以要在一开始的时候将越界的值设为特殊值(我用的负无穷-INF),并且在递归的过程中加入边界条件(若越界,则返回)。
运行到达左上角的时候直接返回左上角的值作为最终终止条件
好吧,下面代码
#include<cstdio>
#include<cstring>
int n,m,x[23][23],ans[23][23];
int sol(int i,int j)
{
if(i==1&&j==1) return x[i][j];
if(i<1||j<1) return -1;
if(ans[i][j]>=0) return ans[i][j];
int tem1=sol(i-1,j);
int tem2=sol(i,j-1);
ans[i][j]=(tem1>tem2?tem1:tem2)+x[i][j];
return ans[i][j];
}
int main()
{
scanf("%d%d",&n,&m);
memset(x,-120,sizeof(x));
memset(ans,-120,sizeof(ans));
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
scanf("%d",&x[i][j]);
}
}
printf("%d\n",sol(n,m));
return 0;
}