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

【题解】摘花生问题

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

【题目描述】

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;
}


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

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

分享给朋友:

相关文章

【题解】最多次数

【题目描述】小蓝有一个字符串 s,他特别喜欢由以下三个字符组成的单词:l,q,b,任意顺序都可以,一共有 6 种可能:lqb、lbq、qlb、qbl、blq、bql。现在...

【题解】单词接龙

【题目描述】单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重...

【题解】营救巨轮

【题目描述】一艘远洋巨轮在大海中遇到故障,船长库克立刻发出了求救信号。距离最近的辽宁号收到了讯息,时间就是生命,必须尽快赶到那里。通过侦测,辽宁号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小...

文具订购(NOI online入门组)

【题目描述】小明的班上共有n元班费,同学们准备使用班费集体购买3种物品。圆规,每个7元。笔,每支4元。笔记本,每本3元。小明负责订购文具,设圆规、笔、笔记本的订购数量为a,b,c,他订购的原则依次如下...

【题解】AC

4.AC(ac.cpp) 【问题描述】 小明获得了一行字符串,他想知道在不改变字符顺序的情况下,从前到后最多能组合出多少个ac? (a和c的位置可以不连续)比如:字符串为addca...

【题解】修改回文

【题目描述】如果一个字符串,顺读与倒读的内容一样,称这个字符串为回文。例如 aka 是一个回文,noon 也是一个回文。给定一个字符串,请计算最少需要修改多少个字符,才能...