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

【题解】采摘花生2

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

【题目描述】

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





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

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

分享给朋友:

相关文章

【题解】单词接龙

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

【题解】小X与机器人

【题解】小X与机器人

【题目描述】小X的老师很喜欢围棋。众所周知,围棋的棋盘有19行19列,共有361个交叉点。为方便起见,我们把这些行列按顺序编号为1~19,并用(x, y)表示第x列第y行的位置。例如下图中,A用(16...

【题解】周末舞会

【题目描述】假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等...

【题解】循环比赛日程表

【题解】循环比赛日程表

【题目描述】设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。【输入描述】输入:M。【输出描述】输出:...

连词成句

【题目描述】有一天,毛毛上课的时候遇到了一个难题,老师让同学们把黑板上的单词连成一句话。已知连词的规则是:从待选词中选出正确的单词按照顺序输出,“正确的单词”表示除第一个单词外,其余单词都是小写字母,...

文具订购(NOI online入门组)

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