当前位置:首页 > 题解目录 > 正文内容

【题解】摘花生问题

亿万年的星光4个月前 (02-06)题解目录663

【题目描述】

Hello Kitty想摘点花生送给她喜欢的米老鼠。

她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。

地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。

Hello Kitty只能向东或向南走,不能向西或向北走。

问Hello Kitty最多能够摘到多少颗花生。

【输入描述】

第一行是一个整数T,代表一共有多少组数据。
接下来是T组数据。
每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。
每组数据的接下来R行数据,从北向南依次描述每行花生苗的情况。每行数据有C个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目M。

【输出描述】

对每组输入数据,输出一行,内容为Hello Kitty能摘到得最多的花生颗数。

【样例输入】

2
2 2
1 1
3 4
2 3
2 3 4
1 6 5

【样例输出】

8
16

【数据范围】

1 ≤ T ≤ 100,
1 ≤ R, C ≤ 100,
0 ≤ M ≤ 1000


【题目分析】

在一个网格中寻找从左上角(西北角)到右下角(东南角)的路径,使得路径上的花生数量之和最大。Hello Kitty只能向东或向南移动,使用动态规划解决这个问题。

  1. 状态定义:
    设 dp[i][j] 表示从起点 (0, 0) 到达 (i, j) 时能够摘到的最大花生数量。

  2. 状态转移方程:

    • 如果 i == 0 且 j == 0dp[i][j] = grid[i][j](起点)。

    • 如果 i == 0dp[i][j] = dp[i][j-1] + grid[i][j](只能从左边来)。

    • 如果 j == 0dp[i][j] = dp[i-1][j] + grid[i][j](只能从上面来)。

    • 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j](从上面或左边来,取最大值)。

  3. 最终结果:
    对于每组数据,dp[R-1][C-1] 即为从起点到终点的最大花生数量。

【参考答案】

#include <bits/stdc++.h>
using namespace std;
int w[100][100], f[100][100];
int t, r, c;
int main () {
	cin >> t;
	while (t --) {
		cin >> r >> c;
		for (int i = 0; i < r; i ++) {
			for (int j = 0; j < c; j ++)
				cin >> w[i][j];
		}
		for (int i = 0; i < r; i ++) {
			for (int j = 0; j < c; j ++) {
				// 对第一行特判
				if (i == 0 && j != 0)
					f[i][j] = f[i][j - 1] + w[i][j];
				else {
					// 对第一列特判
					if (i != 0 && j == 0)
						f[i][j] = f[i - 1][j] + w[i][j];
					else
						// 其他情况
						f[i][j] = max(f[i][j - 1] + w[i][j], f[i - 1][j] + w[i][j]);
				}
			}
		}
		// 因为是从0开始的,所以最后都要减1
		cout << f[r - 1][c - 1] << endl;
	}
	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

猴子吃桃

【题目描述】猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第N天早上想再吃时...

亲和数

【题目描述】自然数a的因子是指能整除a的所有自然数,但不含a本身。例如12的因子为:1,2,3,4,6。若自然数a的因子之和为b,而且b的因子之和又等于a,则称a,b为一对“亲和数” 。求最小的一对亲...

【题解】打击犯罪

【题目描述】某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就...

【题解】公交乘车

【题解】公交乘车

【题目描述】A城市有一条非常特别的街道,该街道在每个公里的节点上都有一个公交车站,乘客可以在任意的公交站点上车,在任意的公交站点下车。乘客根据每次乘坐公交的公里数进行付费,比如,下表就是乘客乘坐不同的...

2021年市南区程序设计竞赛(小学组)

1.建设病房(build.cpp)【题目描述】2020年1月23日下午,武汉市建设局紧急召集中建三局等单位举行专题会议,要求参照2003年抗击非典期间北京小汤山医院模式,在武汉职工疗养院建设火神山医院...

【题解】括号匹配问题

【题目描述】在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括...