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

【题解】采摘花生2

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

【题目描述】

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





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

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

分享给朋友:

相关文章

【题解】日期排序

【题目描述】有一些日期,日期格式为“MM/DD/YYYY”。编程将其按日期大小排列。【输入描述】无【输出描述】无【样例输入】15/12/1999 10/21/2003 10/22/2003 02...

【题解】亲戚

【题目描述】若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是...

【题解】转换的问题

【题目描述】那么,问题来了:输入一个十进制数N,将它转换成R进制数输出。【输入描述】输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<&...

数列

数列

【题目描述】有一个分数序列求出这个序列的前n项和,结果保留两位小数。(注意,不用通分,单项相加即可)【输入描述】一个数字,N【输出描述】前N项的和【样例输入】10【样例输出】16.48【题目分析】(1...

【题解】移动路线

【题目描述】X桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。小明是个调皮的孩子,一...

【题解】跳格子2

【题目描述】地面上有一排长度为n的格子1-n,每个格子上都有一个数xi,开始时你在位置0,每次你可以向前跳1-2格,然后取走格子上的数,直到跳到位置n+1。取走的数的和就是你的得分,现在你想知道你可能...