8分求调
查看原帖
8分求调
454478
cqbzlzm楼主2023/7/12 20:00
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000
int n, m, p;
int a[MAXN + 5][MAXN + 5];
int c[MAXN + 5];
int dp[MAXN + 5];
int sum[MAXN + 5][MAXN + 5];
deque<int> Q[MAXN + 5];
int main() {
	scanf("%d%d%d", &n, &m, &p);
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			scanf("%d", &a[i][j]);
		}
	}
	for (int j = 1; j <= m ; j ++) {
		for (int i = 1; i <= n; i ++) {
			sum[i][j] = sum[((i - 1) - 1 + n) % n + 1][j - 1] + a[i][j];
		}
	}
	for (int i = 1; i <= n; i ++) {
		scanf("%d", &c[i]);
	}
	for (int i = 1; i <= m; i ++) {
		for (int j = 1; j <= n; j ++) {
			while (!Q[j].empty() && Q[j].front() < max(i - p + 1, 1)) {
				Q[j].pop_front();
			}
			
			int k = i;
			while (!Q[j].empty() && ((dp[k - 1] - sum[((j - (i - k + 1) - 1 - 1) % n + n) % n + 1][k - 1] - c[((j - (i - k + 1) - 1 ) % n + n) % n + 1])) >= (dp[Q[j].back() - 1] - sum[((j - (i - Q[j].back() + 1) - 1 - 1) % n + n) % n + 1][Q[j].back() - 1] - c[((j - (i - Q[j].back() + 1) - 1 ) % n + n) % n + 1])) {
				Q[j].pop_back();
			}
			Q[j].push_back(k);
			k = Q[j].front();
			dp[i] = max(dp[i], dp[k - 1] + sum[(j - 1 + n - 1)% n + 1][i] - sum[((j - (i - k + 1) - 1 - 1) % n + n) % n + 1][k - 1] - c[((j - (i - k + 1) - 1 ) % n + n) % n + 1]);
//			for(int k = i; k >= max(i - p + 1, 1); k --) {
//				dp[i] = max(dp[i], dp[k - 1] + sum[(j - 1 + n - 1)% n + 1][i] - sum[((j - (i - k + 1) - 1 - 1) % n + n) % n + 1][k - 1] - c[((j - (i - k + 1) - 1 ) % n + n) % n + 1]);
//			}
		}
	}
	printf("%d", dp[m]);
	return 0;
}
2023/7/12 20:00
加载中...