题目意思:在一个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:\n",z);
27 printf("%d\n\n",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\n",sum);
70 }
71 return 0;
72 }