Sample Input
2
4
7
6 4
2 5 10
9 8 12 2
2 12 7
8 2
10
2
1
2 3
1
Sample Output
Case 1: 63
Case 2: 5
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<stack> #include<cmath> using namespace std; #define INF 0x3f3f3f3f #define maxn 210 long long f[maxn]; int dp[maxn][maxn]; int Map[maxn][maxn]; int main() { int t,n; scanf("%d",&t); int k = 1; while(t--) { scanf("%d",&n); memset(dp,0,sizeof(dp)); memset(Map,0,sizeof(Map)); for(int i=1; i<=n; i++) for(int j = 1; j<=i; j++) scanf("%d",&Map[i][j]);//上半部分的输入 for(int i=n+1; i<=2*n-1; i++) for(int j = 1; j<=2*n-i; j++) scanf("%d",&Map[i][j]);//下半部分的输入 dp[1][1] = Map[1][1]; for(int i=1; i<=n; i++) for(int j = 1; j<=i; j++) { dp[i+1][j] = max(dp[i+1][j],dp[i][j]+Map[i+1][j]); dp[i+1][j+1] = max(dp[i+1][j+1],dp[i][j]+Map[i+1][j+1]); }//上半部分向下的时候每一个点都有两种选择。 for(int i=n+1; i<=2*n-1; i++) for(int j = 1; j<=2*n-i; j++) { dp[i][j] = max(dp[i-1][j],dp[i-1][j+1]) + Map[i][j]; }//下半部分向下走的时候每一个点都取决于它上面的两个点。 printf("Case %d: %d ",k++,dp[2*n-1][1]); } return 0; }