题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25830‘
思路:类似与数塔问题,自底向上处理,输入的时候稍微注意一下就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 222
#define FILL(a,b) memset(a,b,sizeof(a)) int g[MAXN][MAXN],dp[MAXN][MAXN];
int n; int main()
{
int _case,t=;
scanf("%d",&_case);
while(_case--){
scanf("%d",&n);
FILL(g,);
FILL(dp,);
for(int i=;i<=*n-;i++)
for(int j=;j<=*n-;j++){
if(i<=n&&j<=i)scanf("%d",&g[i][j]);
else if(i>n&&j<=*n-i)scanf("%d",&g[i][j]);
}
dp[*n-][]=g[*n-][];
for(int i=*n-;i>=;i--)
for(int j=;j<=*n-i;j++){
if(i>=n)dp[i][j]=max(dp[i+][j],dp[i+][j-])+g[i][j];
else dp[i][j]=max(dp[i+][j],dp[i+][j+])+g[i][j];
}
printf("Case %d: %d\n",t++,dp[][]);
}
return ;
}