数据较大 小心越界
数据较大 有可能会越界
60pts
#include <iostream>
#include<stdio.h>
#define INF 0x7fffffff
using namespace std;
const int maxl = 305;
int n, m, xk, yk, xs, ys, ans = -INF;
int a[maxl][maxl], F[maxl][maxl][maxl], G[maxl][maxl];
bool chk(int x, int y, int xx, int yy) { return (x <= xx && y <= yy && 1 <= x && 1 <= y); }
signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
cin >> xs >> ys >> xk >> yk;
for (int i = 0; i <= n + 1; i++) {
for (int j = 0; j <= m + 1; j++) {
G[i][j] = -INF;
for (int k = 0; k <= n + 1; k++) F[i][j][k] = -INF;
}
}
G[xk][yk] = a[xk][yk];
for (int i = xk; i >= 1; i--) {
for (int j = yk; j >= 1; j--) {
if (i) G[i - 1][j] = max(G[i - 1][j], G[i][j] + a[i - 1][j]);
if (j) G[i][j - 1] = max(G[i][j - 1], G[i][j] + a[i][j - 1]);
}
}
F[1][1][1] = max(a[1][1], 0), ans = G[1][1];
for (int i = 1; i <= xk; i++) {
for (int j = 1; j <= yk; j++) {
for (int k = max(1, i + j - ys); k <= min(i + j - 1, xs); k++) {
int w = i + j - k, delta = ((i == k) ? (max(a[i][j], 0)) : (a[i][j] + max(a[k][w], 0)));
if (i != 1 || j != 1 || k != 1) F[i][j][k] = max(max(F[i - 1][j][k], F[i - 1][j][k - 1]), max(F[i][j - 1][k], F[i][j - 1][k - 1])) + delta;
if (chk(i + 1, j, xk, yk) && chk(i, j + 1, xs, ys)) ans = max(ans, F[i][j][i] + G[i + 1][j]);
if (chk(i, j + 1, xk, yk) && chk(i + 1, j, xs, ys)) ans = max(ans, F[i][j][i] + G[i][j + 1]);
if (xk == xs && yk == ys && chk(i, j, xk, yk) && chk(i, j, xs, ys)) ans = max(ans, max(F[i - 1][j][i], F[i][j - 1][i - 1]) + G[i][j]);
}
}
}
cout << ans << endl;
return 0;
}
100pts
#include <iostream>
#include<stdio.h>
#define INF 0x7fffffff
using namespace std;
const int maxl = 305;
int n, m, xk, yk, xs, ys, ans = -INF;
int a[maxl][maxl], F[maxl][maxl][maxl], G[maxl][maxl];
bool chk(int x, int y, int xx, int yy) { return (x <= xx && y <= yy && 1 <= x && 1 <= y); }
signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
cin >> xs >> ys >> xk >> yk;
for (int i = 0; i <= n + 1; i++) {
for (int j = 0; j <= m + 1; j++) {
G[i][j] = -INF;
for (int k = 0; k <= n + 1; k++) F[i][j][k] = -INF;
}
}
G[xk][yk] = a[xk][yk];
for (int i = xk; i >= 1; i--) {
for (int j = yk; j >= 1; j--) {
if (i) G[i - 1][j] = max(G[i - 1][j], G[i][j] + a[i - 1][j]);
if (j) G[i][j - 1] = max(G[i][j - 1], G[i][j] + a[i][j - 1]);
}
}
F[1][1][1] = max(a[1][1], 0), ans = G[1][1];
for (int i = 1; i <= xk; i++) {
for (int j = 1; j <= yk; j++) {
for (int k = max(1, i + j - ys); k <= min(i + j - 1, xs); k++) {
int w = i + j - k, delta = ((i == k) ? (max(a[i][j], 0)) : (a[i][j] + max(a[k][w], 0)));
if (i != 1 || j != 1 || k != 1) F[i][j][k] = max(max(F[i - 1][j][k], F[i - 1][j][k - 1]), max(F[i][j - 1][k], F[i][j - 1][k - 1])) + delta;
if (chk(i + 1, j, xk, yk) && chk(i, j + 1, xs, ys)) ans = max(ans, F[i][j][i] + G[i + 1][j]);
if (chk(i, j + 1, xk, yk) && chk(i + 1, j, xs, ys)) ans = max(ans, F[i][j][i] + G[i][j + 1]);
if (xk == xs && yk == ys && chk(i, j, xk, yk) && chk(i, j, xs, ys)) ans = max(ans, max(F[i - 1][j][i], F[i][j - 1][i - 1]) + G[i][j]);
}
}
}
cout << ans << endl;
return 0;
}
#include <iostream>
#include<stdio.h>
#define int long long
#define INF 0x7fffffffffffffff
using namespace std;
const int maxl = 305;
int n, m, xk, yk, xs, ys, ans = -INF;
int a[maxl][maxl], F[maxl][maxl][maxl], G[maxl][maxl];
bool chk(int x, int y, int xx, int yy) { return (x <= xx && y <= yy && 1 <= x && 1 <= y); }
signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
cin >> xs >> ys >> xk >> yk;
for (int i = 0; i <= n + 1; i++) {
for (int j = 0; j <= m + 1; j++) {
G[i][j] = -INF;
for (int k = 0; k <= n + 1; k++) F[i][j][k] = -INF;
}
}
G[xk][yk] = a[xk][yk];
for (int i = xk; i >= 1; i--) {
for (int j = yk; j >= 1; j--) {
if (i) G[i - 1][j] = max(G[i - 1][j], G[i][j] + a[i - 1][j]);
if (j) G[i][j - 1] = max(G[i][j - 1], G[i][j] + a[i][j - 1]);
}
}
F[1][1][1] = max(a[1][1], 0ll), ans = G[1][1];
for (int i = 1; i <= xk; i++) {
for (int j = 1; j <= yk; j++) {
for (int k = max(1ll, i + j - ys); k <= min(i + j - 1ll, xs); k++) {
int w = i + j - k, delta = ((i == k) ? (max(a[i][j], 0ll)) : (a[i][j] + max(a[k][w], 0ll)));
if (i != 1 || j != 1 || k != 1) F[i][j][k] = max(max(F[i - 1][j][k], F[i - 1][j][k - 1]), max(F[i][j - 1][k], F[i][j - 1][k - 1])) + delta;
if (chk(i + 1, j, xk, yk) && chk(i, j + 1, xs, ys)) ans = max(ans, F[i][j][i] + G[i + 1][j]);
if (chk(i, j + 1, xk, yk) && chk(i + 1, j, xs, ys)) ans = max(ans, F[i][j][i] + G[i][j + 1]);
if (xk == xs && yk == ys && chk(i, j, xk, yk) && chk(i, j, xs, ys)) ans = max(ans, max(F[i - 1][j][i], F[i][j - 1][i - 1]) + G[i][j]);
}
}
}
cout << ans << endl;
return 0;
}