玩得开心

题目描述

YMH同学是个爱玩的孩纸,总会想各种游戏来玩。这天,YMH同学又想到了一个好玩的游戏。在一个M行N列的矩阵中(0<N,M<=50),每一个小格子都有一个0到100的自然数,YMH同学想从左上角(1,1)跳到右下角(M,N)。跳的时候只能想下或者向右跳,每到达一个格子都会把那个格子里的数取走,YMH想要得到最大的总和,如果能帮她得到最大总和的话,她会给你这些总和 % 1 个糖果哦!

输入

第一行为整数M和N。

接下来是一个M*N的矩阵。

输出

一个整数,表示YMH同学所得到的最大总和。

样例输入

3 3
1 1 1
0 3 1
0 2 0

样例输出

7


此题目是动态规划问题,也可以用贪心算法来解决,具体看代码。
#include <cstdio>

int maps[55][55];
int m, n;
int ans;

void solve(int i, int j, int p);

int main()
{
    scanf("%d%d", &m, &n);

    ans = 0;
    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
            scanf("%d", &maps[i][j]);
    }
    solve(0, 0, maps[0][0]);
    printf("%d\n", ans);
    return 0;
}

void solve(int i, int j, int p)
{
    if (i == m-1 && j == n-1)
    {
        p += maps[i][j];
        if (p > ans)
            ans = p;
        return;
    }
    else if (i == m-1 && j < n-1)
    {
        solve(i, j+1, p+maps[i][j+1]);
        return;
    }
    else if (i < m-1 && j == n-1)
    {
        solve(i+1, j, p+maps[i+1][j]);
        return;
    }
    else if (i < m-1 && j < n-1)
    {
        if (maps[i+1][j] > maps[i][j+1]){
            solve(i+1, j, p+maps[i+1][j]);
            return;
        }
        else {
            solve(i, j+1, p+maps[i][j+1]);
            return;
        }
        return;
    }
    return;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值