1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <queue> 6 #define ll long long 7 8 using namespace std; 9 const int N = 1e5+1000; 10 11 int dp[105*2][105][105]; 12 int maze[105][105]; 13 14 15 int dfs(int sum,int a,int b) 16 { 17 if(dp[sum][a][b] != -1) 18 return dp[sum][a][b]; 19 if(sum == 0 && a == 0 && b == 0) 20 return dp[sum][a][b] = maze[0][0]; 21 dp[sum][a][b] = 0; 22 if(a == b) 23 { 24 if(sum - 1 >= 0) 25 dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a,b) + maze[a][sum-a]); 26 if(sum - 1 >= 0 && a - 1 >= 0) 27 dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a-1,b)+ maze[a][sum-a]); 28 if(sum - 1 >= 0 && b - 1 >= 0) 29 dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a,b-1) + maze[a][sum-a]); 30 if(sum - 1 >= 0 && a - 1 >= 0 && b - 1 >= 0) 31 dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a-1,b-1) + maze[a][sum-a]); 32 } 33 else 34 { 35 if(sum - 1 >= 0) 36 dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a,b) + maze[a][sum-a]+maze[b][sum-b]); 37 if(sum - 1 >= 0 && a - 1 >= 0) 38 dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a-1,b)+ maze[a][sum-a]+maze[b][sum-b]); 39 if(sum - 1 >= 0 && b - 1 >= 0) 40 dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a,b-1) + maze[a][sum-a]+maze[b][sum-b]); 41 if(sum - 1 >= 0 && a - 1 >= 0 && b - 1 >= 0) 42 dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a-1,b-1) + maze[a][sum-a]+maze[b][sum-b]); 43 } 44 return dp[sum][a][b]; 45 } 46 47 void solve() 48 { 49 int m,n; 50 scanf("%d %d",&m,&n); 51 memset(dp,-1,sizeof(dp)); 52 memset(maze,0,sizeof(maze)); 53 for(int i = 0; i < m; i++) 54 for(int j = 0; j < n; j++) 55 scanf("%d",&maze[i][j]); 56 57 int ans = dfs(n+m-2,m-1,m-1); 58 59 printf("%d ",ans); 60 } 61 62 int main(void) 63 { 64 int t,cnt = 0; 65 scanf("%d",&t); 66 67 while(t--) 68 { 69 printf("Case %d: ",++cnt); 70 solve(); 71 } 72 return 0; 73 }