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

【题解】采摘花生2

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

【题目描述】

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





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

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

分享给朋友:

相关文章

字符全排列

【题目描述】给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。我们假设对于小写字母有‘a’ <‘b’ < … <‘y’<‘z’,而且给定的字符串中的字母已经按照...

【题解】BFS—迷宫问题(1)

【题解】BFS—迷宫问题(1)

【题目描述】一个5*5的矩阵,矩阵内用0,1显示。其中,0是路,表示这个点可以走,1是墙表示这个点不可以走。问,从给定的矩阵中从左上角到右下角最少需要走多少步?注:题目保证有解(不存在左上角和右下角为...

【题解】单词接龙

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

【题解】求次方和

【题目描述】    求解 (2^0 + 2^1 + 2^2+ ... + 2^n) % 2333【输入描述】    一行,一个整数n。【输出...

【题解】小X与机器人

【题解】小X与机器人

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

【题解】运动员和训练师的最大匹配数

【题目描述】给你一个下标从 0 开始的整数数组 players ,其中 players[i] 表示第 i 名运动员的&n...