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 }
原文地址:https://www.cnblogs.com/tangyimin/p/10578406.html
时间: 2024-10-08 14:15:03