1022: 淘金(2017年中南大学研究生复试机试题 )
Posted tangyimin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于1022: 淘金(2017年中南大学研究生复试机试题 )的主要内容,如果未能解决你的问题,请参考以下文章