現在平面上有k個矩陣,每個矩陣有統計的代價,若有兩個矩陣相交了, 請計算兩個矩陣所包含的每一個元素的價值之和(相交部分只計算一次),再減去兩個矩陣的代價,求最大的這個式子答案
直接暴力枚舉每一對矩陣就好了
#include<iostream>
#include<cstdio>
using namespace std;
int n, m, k;
long long s[1005][1005], ans = -2147483647000000;
struct Matrix
{
long long x0, y0, x1, y1, c;
}M[1005];
int read()
{
int x = 0, flag = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') flag = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + ch - '0'; ch = getchar();}
return x * flag;
}
int main()
{
freopen("bti.in", "r", stdin);
freopen("bti.out", "w", stdout);
n = read(); m = read(); k = read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
s[i][j] =(long long) (s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + read());//計算二維前綴和
for (int i = 1; i <= k; ++i)
M[i].x0 = read(), M[i].y0 = read(), M[i].x1 = read(), M[i].y1 = read(), M[i].c = read();
for (int i = 1; i <= k; ++i)
for (int j = i + 1; j <= k; ++j)
{
long long x0 = max(M[i].x0, M[j].x0);
long long x1 = min(M[i].x1, M[j].x1);
long long y0 = max(M[i].y0, M[j].y0);
long long y1 = min(M[i].y1, M[j].y1);
if (x0 <= x1 && y0 <= y1)
{
long long s1 = s[M[i].x1][M[i].y1] + s[M[i].x0 - 1][M[i].y0 - 1] - s[M[i].x1][M[i].y0 - 1] - s[M[i].x0 - 1][M[i].y1];
long long s2 = s[M[j].x1][M[j].y1] + s[M[j].x0 - 1][M[j].y0 - 1] - s[M[j].x1][M[j].y0 - 1] - s[M[j].x0 - 1][M[j].y1];
long long s3 = s[x1][y1] + s[x0 - 1][y0 - 1] - s[x0 - 1][y1] - s[x1][y0 - 1];//相交部分
ans = max(ans, s1 + s2 - s3 - M[i].c - M[j].c);
}
}
if (ans == -2147483647000000) printf("F");
else printf("%lld", ans);
return 0;
}