夺取宝藏
问题
题目描述
Ipomy 现在来到了阿兹特克宝藏堆中。这些宝藏散落放在一个 m * n 的网格上,每个宝藏都有一个价值。Ipomy 自然是希望将所有宝藏统统拿走,但他在走出迷宫时,不小心中了魔咒,一次只能向下或向右移动一步。假设 Ipomy 身处网格的左上角,而古城的出口在右下角,他想在离开古城前,拿到价值之和尽可能大的宝藏。请你编写程序,帮助他计算他可以拿到的最大价值之和。
输入描述
多组输入。
每组输入的第一行为两个整数 m 和 n,用来描述网格的规格。保证 1 <= m, n <= 1000。
接下来的 m 行,每行 n 个整数,表示每个格子上面的宝藏的价值。输入数据保证 Ipomy 起始所在处没有宝藏,即价值为 0,以及每个宝藏的价值均在 int 型的表示范围内。
输出描述
多组输出。
每组输出占据一行,为一个整数,表示最大的价值之和。
样例输入
3 4
0 5 2 3
4 5 6 7
8 9 10 11
样例解释
一路向下走,取到 4 和 8,接着一路向右走,取到 9, 10 和 11,价值之和为 42。
样例输出
42
思考
动态规划,本来以为这道题会很难的,但是后来在网上搜是动态规划求解,又回来想怎么用递归写函数。
但是后来发现根本就是多此一举,直接for循环遍历就好了。
用map[i][j]
表示第i行j列的宝藏的价值,price[i][k]
表示从(0,0)到(i,j)的价值之和。因为每次只能向上或向下走,那么price[i][j]=map[i][j]+max(price[i-1][j],price[i][j-1])
。
然后两个for循环遍历整个map数组,最后打印price[m][n]
即可。
代码
点击查看代码
#include <iostream>
#include <algorithm>
using namespace std;
int map[1001][1001];
int price[1001][1001] = {0};
int main()
{
int m, n;
while (cin >> m >> n)
{
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
{
cin >> map[i][j];
price[i][j] = map[i][j] + max(price[i - 1][j], price[i][j - 1]);
}
cout << price[m][n] << endl;
}
return 0;
}