链接:https://www.nowcoder.com/acm/contest/131/B
来源:牛客网
第一行输入五个整数 R,C,X,Y,Z。
1 ≤ X ≤ R.9
1 ≤ Y ≤ C.
1 ≤ Z ≤ R x C.
-10
≤ Mi,j
≤ 109
输出满足以上条件的最大子矩阵和。
0
#include<stdio.h> #include<algorithm> using namespace std; #define LL long long LL a[505][505], sum[505][505], q[505], s0[505][505], ts[505], t1[505]; int main(void) { LL now, ans, zero; int n, m, i, j, c, d, e, k, L, R; scanf("%d%d%d%d%d", &n, &m, &c, &d, &e); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%lld", &a[i][j]); sum[i][j] = sum[i][j-1]+a[i][j]; s0[i][j] = s0[i][j-1]; if(a[i][j]==0) s0[i][j]++; } } ans = 0; for(i=1;i<=m;i++) { for(j=i;j<=m;j++) { if(j-i+1>=d+1) continue; now = zero = 0; L = R = 0; q[R++] = 0; for(k=1;k<=n;k++) { now += sum[k][j]-sum[k][i-1]; zero += s0[k][j]-s0[k][i-1]; ts[k] = now; t1[k] = zero; while(L<R && q[L]+c<k) L++; while(L<R && zero-t1[q[L]]>e) L++; ans = max(ans, now-ts[q[L]]); while(L<R && ts[q[R-1]]>=now) R--; q[R++] = k; } } } printf("%lld\n", ans); return 0; }
原文:https://www.cnblogs.com/xiechenxi/p/9313602.html