
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 4e5 + 1;
int n, m, p[maxn];
vector<vector<int>> a, f, sum;
void init() {
a.resize(n + 2, vector<int>(m + 2));
f.resize(n + 2, vector<int>(m + 2));
sum.resize(n + 2, vector<int>(m + 2));
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
init();
for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> a[i][j];
int tmp = n + m - 1;
for (int i = 1; i <= tmp; i++) cin >> p[i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
int k = i + j - 1;
int w = a[i][j] - p[k];
if (i == 1 && j == 1) {
f[i][j] = w;
sum[i][j] = w;
} else if (i == 1) {
sum[i][j] = sum[i][j - 1] + w;
f[i][j] = min(f[i][j - 1], sum[i][j]);
} else if (j == 1) {
sum[i][j] = sum[i - 1][j] + w;
f[i][j] = min(f[i - 1][j], sum[i][j]);
} else {
int left = min(f[i][j - 1], sum[i][j - 1] + w);
int up = min(f[i - 1][j], sum[i - 1][j] + w);
if (left > up) {
f[i][j] = left;
sum[i][j] = sum[i][j - 1] + w;
} else if (up > left) {
f[i][j] = up;
sum[i][j] = sum[i - 1][j] + w;
} else {
f[i][j] = left;
if (sum[i][j - 1] + w > sum[i - 1][j] + w) sum[i][j] = sum[i][j - 1] + w;
else sum[i][j] = sum[i - 1][j] + w;
}
}
}
cout << max(0LL, -f[n][m]);
return 0;
}