萌新求助
  • 板块灌水区
  • 楼主KunKunYuYu
  • 当前回复15
  • 已保存回复15
  • 发布时间2024/9/5 19:45
  • 上次更新2024/9/5 19:53:29
查看原帖
萌新求助
1268749
KunKunYuYu楼主2024/9/5 19:45

rt 以下是题目 【问题描述】 有一块地被划分成了 n∗m 个区域,在一些区域里有垃圾要拾捡。现在科研人员开发了一个能捡垃圾的机器人,机器人每一次都可以移动一个区域的距离,假设机器人从最左上区域出发,他每次只能向右或者向下走。每次他到达一个点,就会自动把这个点内的垃圾拾掉。

问:该机器人最多能够拾多少垃圾?

在最多情况下,有多少种方案?

【输入格式】 输入文件的第一行为两个整数 n 和m;

接下来有一个 n∗m的 01 矩阵。矩阵中的第i 行 j 列的数字 a[i][j]=0 表示为空地,a[i][j]=1 表示为垃圾。

【输出格式】 输出两行,第一行为一个数字表示最多拾到的垃圾,第二行为一个数字表示在最多情况下,有多少种方案。

【样例输入1】

3 3
100
000
010

【样例输出1】

2
3

【样例输入2】

6 7
0101000
0001010
0000000
0001001
0000000
0000010

【样例输出2】

5
11

【样例解释】 无

【数据范围及约定】 n≤100,m≤100

这是题目, 接下来是我求调的代码

#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 105;

void dfs(int d[MAX_N][MAX_N], int m, int n, int& mt, int& mp) {
    int dp[MAX_N][MAX_N] = {0};
    int f[MAX_N][MAX_N] = {0};

    dp[0][0] = d[0][0];
    f[0][0] = 1;
    for (int i = 1; i < m; ++i) {
        dp[i][0] = dp[i - 1][0] + d[i][0];
        f[i][0] = 1;
    }
    for (int j = 1; j < n; ++j) {
        dp[0][j] = dp[0][j - 1] + d[0][j];
        f[0][j] = 1;
    }

    for (int i = 1; i < m; ++i) {
        for (int j = 1; j < n; ++j) {
            int s = dp[i - 1][j];
            int z = dp[i][j - 1];
            dp[i][j] = max(s, z) + d[i][j];
            if (s > z)
                f[i][j] = f[i - 1][j];
            else if (s < z)
                f[i][j] = f[i][j - 1];
            else
                f[i][j] = f[i - 1][j] + f[i][j - 1];
        }
    }

    mt = dp[m - 1][n - 1];
    mp = f[m - 1][n - 1];
}

int main() {
    int m, n;
    cin >> m >> n;
    int d[MAX_N][MAX_N];
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            char ch;
            cin >> ch;
            d[i][j] = int(ch - '0');
        }
    }
    int mt, mp;
    dfs(d, m, n, mt, mp);
    cout << mt << endl;
    cout << mp << endl;
    return 0;
}

2024/9/5 19:45
加载中...