1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 main() 8 { 9 int map[110][110], n, m, i, j, dp1[110], dp2[110]; 10 int t, k=1; 11 scanf("%d",&t); 12 while(t--) 13 { 14 scanf("%d %d",&n,&m); 15 for(i=1;i<=n;i++) 16 { 17 for(j=1;j<=m;j++) 18 scanf("%d",&map[i][j]); 19 } 20 21 for(i=1;i<=n;i++) //第一列只能由上面的點到達 22 map[i][1]+=map[i-1][1]; 23 24 for(j=2;j<=m;j++) //枚舉每一列 25 { 26 dp1[n+1]=dp2[n+1]=dp1[0]=dp2[0]=-9999999; 27 28 for(i=1;i<=n;i++) //從上到下和從左到右最小的放在dp1中 29 dp1[i]=max(dp1[i-1],map[i][j-1])+map[i][j]; 30 for(i=n;i>=1;i--) // 從下到上和從左到右最小的放在dp2中 31 dp2[i]=max(dp2[i+1],map[i][j-1])+map[i][j]; 32 33 for(i=1;i<=n;i++) //更新該列的每個點 34 map[i][j]=max(dp1[i],dp2[i]); 35 } 36 37 printf("Case #%d:\n%d\n",k++,map[1][m]); 38 } 39 }