警钟砸烂
查看原帖
警钟砸烂
722084
Fimlty楼主2023/1/9 19:46

数据较大 小心越界

60pts

数据较大 有可能会越界

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;
}

100pts

#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;
}
2023/1/9 19:46
加载中...