- 题解
mine 解题报告
- 2023-2-25 16:00:08 @
设 表示当前金矿向左获利最大值, 表示当前金矿向上获利最大值,则有
$$f[i][j][0] = f[i][j-1][0]+a[i]\\ f[i][j][1]=f[i-1][j][1]+b[i] $$我们还需要将总和求出来。
那么,我们设 为 行, 列的金矿总和最大值,由于只能往左运或往上运,所以可以得出这张图:
- 往上时,
- 往左时,
#include "bits/stdc++.h"
using namespace std;
int f[1500][1500][2];
int dp[1500][1500];
int a[1500][1500];
int b[1500][1500];
int n, m;
int main() {
freopen ("mine.in", "r", stdin);
freopen ("mine.out", "w", stdout);
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) scanf ("%d", &a[i][j]);
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) scanf ("%d", &b[i][j]);
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
f[i][j][0] = f[i][j - 1][0] + a[i][j];
f[i][j][1] = f[i - 1][j][1] + b[i][j];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
dp[i][j] = max(dp[i - 1][j] + f[i][j][0], dp[i][j - 1] + f[i][j][1]);
}
}
printf ("%d", dp[n][m]);
}
0 条评论
目前还没有评论...