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