杭电2391--Filthy Rich(DP)

题目意思:在一个n*m的矩阵中,不同的位置有不同重量的黄金,从矩阵的左上角开始,到右下角,只能向下或向右走,问最多能获得多少黄金?
思路:算出每个点到起点的最大值,找自己左面,上面,左上面的最大值加上自己即为最大值。
 1 #include <iostream>    //dp
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 int m[1100][1100];      //m数组放矩阵
 7 int sum=0,r,c;
 8 int dp(int x,int y)
 9 {
10     return max(m[x-1][y],max(m[x][y-1],m[x-1][y-1]));
11 }
12 int main()
13 {
14     int n;
15     scanf("%d",&n);
16     for(int z=1;z<=n;z++)
17     {
18         scanf("%d%d",&r,&c);
19         memset(m,0,sizeof(m));
20         for(int i=1;i<=r;i++)
21             for(int j=1;j<=c;j++)
22             scanf("%d",&m[i][j]);
23         for(int i=1;i<=r;i++)
24             for(int j=1;j<=c;j++)
25              m[i][j]+=dp(i,j);
26         printf("Scenario #%d:
",z);
27         printf("%d

",m[r][c]);
28     }
29     return 0;
30 }
31  
32 #include <iostream>              //深搜,在杭电上面提交时间超限。
33 #include <cstdio>
34 #include <cstring>
35 using namespace std;
36 int a[3][2]={{1,0},{0,1},{1,1}};
37 int m[1100][1100];
38 int sum=0,r,c;
39 void dfs(int x,int y,int s)
40 {
41     if(x==r-1&&y==c-1)
42     {
43        if(s>sum)
44             sum=s;
45        return;
46     }
47     int xx,yy;
48     for(int i=0;i<3;i++)
49     {
50         xx=x+a[i][0];
51         yy=y+a[i][1];
52         if(xx>=0&&xx<=r-1&&yy>=0&&yy<=c-1)
53         dfs(xx,yy,s+m[xx][yy]);
54     }
55     return;
56 }
57 int main()
58 {
59     int n;
60     scanf("%d",&n);
61     while(n--)
62     {
63         scanf("%d%d",&r,&c);
64         memset(m,0,sizeof(m));
65         for(int i=0;i<r;i++)
66             for(int j=0;j<c;j++)
67             scanf("%d",&m[i][j]);
68             dfs(0,0,m[0][0]);
69         printf("%d
",sum);
70     }
71     return 0;
72 }

 

原文地址:https://www.cnblogs.com/zou-zou/p/5320507.html