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

【题解】采摘花生2

亿万年的星光1年前 (2025-02-06)题解目录1394

【题目描述】

Hello Kitty又一次来到花生地里摘花生,从左上角进入花生地,从右下角出去,只能向右或者向下,请问Hello Kitty应该沿着什么样的路线走,能够摘到的花生数量最多(假设花生地里没有任何2株的花生一样多,也不存在多条路线能够摘到一样多的花生的情况)?
比如输入:
2 2
1 2
3 4
应该输出:1-3-4,也就是按照1 3 4这三株数量的花生摘过去,能够摘到最多的花生!

【输入描述】

第一行是2个整数m和n(2=<m,n<=100),代表花生地有m行,n列花生!

后面m行,每行有n个整数代表了每行中,每株花生的数量

【输出描述】

输出Hello Kitty按照走过的路线中,摘到每株花生的数量。

【样例输入】

2 2
1 2 
3 4

【样例输出】

1-3-4

【题目分析】

花生采摘题目基础之上修改的。



【参考答案】

#include <iostream>
using namespace std;

const int MAX = 100;
int w[MAX][MAX];  // 花生数量
int f[MAX][MAX];  // 最大花生数量
int path[MAX][MAX];  // 记录路径方向,0表示从上方,1表示从左方

void printPath(int i, int j) {
    if (i == 0 && j == 0) {
        cout << w[i][j];
        return;
    }
    if (path[i][j] == 0) {
        printPath(i - 1, j);
    } else {
        printPath(i, j - 1);
    }
    cout << "-" << w[i][j];
}

int main() {
    int r, c;
    cin >> r >> c;

    // 输入花生数量
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            cin >> w[i][j];
        }
    }

    // 初始化起点
    f[0][0] = w[0][0];

    // 动态规划计算最大花生数量
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (i == 0 && j == 0) continue;  // 起点已初始化
            if (i == 0) {
                // 第一行只能从左方移动过来
                f[i][j] = f[i][j - 1] + w[i][j];
                path[i][j] = 1;  // 从左方
            } else if (j == 0) {
                // 第一列只能从上方移动过来
                f[i][j] = f[i - 1][j] + w[i][j];
                path[i][j] = 0;  // 从上方
            } else {
                // 其他情况,选择上方或左方中较大的
                if (f[i - 1][j] > f[i][j - 1]) {
                    f[i][j] = f[i - 1][j] + w[i][j];
                    path[i][j] = 0;  // 从上方
                } else {
                    f[i][j] = f[i][j - 1] + w[i][j];
                    path[i][j] = 1;  // 从左方
                }
            }
        }
    }

    // 输出路径
    printPath(r - 1, c - 1);
    cout << endl;
    return 0;
}





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

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

    分享给朋友:

    相关文章

    【题解】单词接龙

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

    【题解】最大公约数(2019青岛市程序设计竞赛)

    【问题描述】给定n,以及正整数序列a1,a2,…,an与b1,b2,…,bn。令:sa=a1*a2*…*ansb=b1*b2*…*bn求sa和sb的最大公约数gcd(sa,sb)。【输入】第一行n。第...

    【题解】真分数(2019青岛市程序设计竞赛)

    【描述】真分数,指的是分子比分母小的分数,真分数的分数值小于1。给出n个正整数,任取两个数分别作为分子和分母组成真分数。求能组成多少不同值的真分数。【输入】第一行是一个正整数n。第二行是n个不同的正整...

    【题解】位数问题

    【题目描述】在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。比如:在所有的2位数字,包含0个3的数有72个,包含2个3的数有1个,共73个。(...

    【题解】寻找祖先

    【题解】寻找祖先

    【题目描述】给出充足的父子关系,请你编写程序找到某个人的最早的祖先。规定每个人的名字都没有空格,且没有任意两个人的名字相同。最多可能有1000组父子关系,总人数最多可能达到50000人,家谱中的记载不...

    【题解】上学线路(2019青岛市程序设计比赛)

    【题解】上学线路(2019青岛市程序设计比赛)

     【题目描述】小D从家到学校的道路结构是这样的:由n条东西走向和m条南北走向的道路构成了一个n*m的网格,每条道路都是单向通行的(只能从北向南,从西向东走)。已知小D的家在网格的左上角,学校...