1022: 淘金(2017年中南大学研究生复试机试题 )

1022: 淘金

时间限制: 1 Sec  内存限制: 128 MB
提交: 205  解决: 75
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

在一片n*m的土地上,每一块1*1的区域里都有一定数量的金子。这一天,你到这里来淘金,然而当地人告诉你,如果你挖了某一区域的金子,上一行,下一行,左边,右边的金子你都不能被允许挖了。那么问题来了:你最多能淘金多少?

输入

对于每组数据,第一行两个数n,m,表示土地的长和宽(1<=n,m<=200)

接下来n行,每行m个数,表示每个区域的金子数量,每个区域的金子数量不超过1000

输出

对于每组数据,输出最多得到的金子数量

样例输入

4 6
11 0 7 5 13 9
78 4 81 6 22 4
1 40 9 34 16 10
11 22 0 33 39 6

样例输出

242

来源/分类

 
 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 /*典型的动态规划题目,其实这道题可以拆开来看,行和列,先对每一行做动态规划,可以
 5 得出这一行能够挖到的最大数量的金币,然后用一个数组把每一行的最大值记录下来,再
 6 对这个数组进行动态规划,两次的规则是一样的*/
 7 int distcol[205];//行记录
 8 int distrol[205];//列记录
 9 int result[205];//结果记录
10 int gold[205][205];
11 int max(int a, int b){
12     if (a > b)return a;
13     return b;
14 }
15 int main(){
16     int n, m;
17     while (cin>>n>>m){
18         for (int i = 0; i < n; i++){
19             for (int j = 0; j < m; j++){
20                 cin >> gold[i][j];
21             }
22         }
23         for (int i = 0; i < n; i++){
24             distcol[0] = gold[i][0];
25             distcol[1] = max(gold[i][0], gold[i][1]);
26             for (int j = 2; j < m; j++){//判断这个位置到底挖不挖
27                 distcol[j] = max(distcol[j - 1], distcol[j - 2] + gold[i][j]);
28             }
29             distrol[i] = distcol[m-1];
30         }
31         result[0] = distrol[0];
32         result[1] = max(distrol[0], distrol[1]);
33         for (int i = 2; i < n; i++){//判断这一行到底挖不挖
34             result[i] = max(result[i - 1], result[i - 2] + distrol[i]);
35         }
36         cout << result[n - 1] << endl;
37 
38     }
39     return 0;
40 }

 

posted @ 2019-03-22 15:14  我是happy唐啊  阅读(546)  评论(0编辑  收藏  举报