夺取宝藏

问题

题目描述

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

posted @ 2022-03-25 11:46  请去看诡秘之主  阅读(315)  评论(0)    收藏  举报