题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25830‘
思路:类似与数塔问题,自底向上处理,输入的时候稍微注意一下就可以了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 222 7 #define FILL(a,b) memset(a,b,sizeof(a)) 8 9 int g[MAXN][MAXN],dp[MAXN][MAXN]; 10 int n; 11 12 int main() 13 { 14 int _case,t=1; 15 scanf("%d",&_case); 16 while(_case--){ 17 scanf("%d",&n); 18 FILL(g,0); 19 FILL(dp,0); 20 for(int i=1;i<=2*n-1;i++) 21 for(int j=1;j<=2*n-1;j++){ 22 if(i<=n&&j<=i)scanf("%d",&g[i][j]); 23 else if(i>n&&j<=2*n-i)scanf("%d",&g[i][j]); 24 } 25 dp[2*n-1][1]=g[2*n-1][1]; 26 for(int i=2*n-2;i>=1;i--) 27 for(int j=1;j<=2*n-i;j++){ 28 if(i>=n)dp[i][j]=max(dp[i+1][j],dp[i+1][j-1])+g[i][j]; 29 else dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+g[i][j]; 30 } 31 printf("Case %d: %d\n",t++,dp[1][1]); 32 } 33 return 0; 34 }