Poj2948Martian Mining(记忆化)

链接

这题意好难懂 看得迷迷糊糊 想的也迷迷糊糊  后来睡了会突然想到了。。不就是类似以前的矩阵操作

从右下角记忆化   大的由小的推来

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\n",ans);
41     }
42     return 0;
43 }
View Code

 

posted @ 2013-09-17 18:39  _雨  阅读(271)  评论(0编辑  收藏  举报