ABC E 求条
  • 板块学术版
  • 楼主pipilong2024
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/7/19 21:49
  • 上次更新2025/7/20 13:17:28
查看原帖
ABC E 求条
1258210
pipilong2024楼主2025/7/19 21:49

代码如下:

#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;
}
2025/7/19 21:49
加载中...