这题意好难懂 看得迷迷糊糊 想的也迷迷糊糊 后来睡了会突然想到了。。不就是类似以前的矩阵操作
从右下角记忆化 大的由小的推来
dp[i][j] = max(dp[i-1][j]+s1,dp[i][j-1]+s2) s1 = a[i][g]+..a[i][j] s2 = b[g][j]+..b[i][j]

1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 int dp[550][550]; 8 int n,m; 9 int a[550][550]; 10 int b[550][550]; 11 int dfs(int i,int j) 12 { 13 if(i<1||j<1) 14 return 0; 15 if(dp[i][j]!=-1) 16 return dp[i][j]; 17 int g,s1=0,s2=0; 18 for(g = 1 ; g <= i ; g++) 19 s1+=b[g][j]; 20 for(g = 1; g <= j ; g++) 21 s2+=a[i][g]; 22 dp[i][j] = max(dfs(i-1,j)+s2,dfs(i,j-1)+s1); 23 return dp[i][j]; 24 } 25 int main() 26 { 27 int i,j; 28 while(scanf("%d%d",&n,&m)!=EOF) 29 { 30 if(n==0&&m==0) 31 break; 32 memset(dp,-1,sizeof(dp)); 33 for(i = 1; i <= n ; i++) 34 for(j = 1 ; j <= m ; j++) 35 scanf("%d",&a[i][j]); 36 for(i = 1; i <= n ; i++) 37 for(j = 1 ; j <= m ; j++) 38 scanf("%d",&b[i][j]); 39 int ans = dfs(n,m); 40 printf("%d ",ans); 41 } 42 return 0; 43 }