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

 

你可能感兴趣的:(poj)