Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cassert>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- const int n = 8;
- const int NAN = -239;
- const int INF = 1e9;
- int c[n][n];
- int dp[n][n][2];
- int solve(int x, int y, int f) {
- if (x >= n || y >= n) return f ? -INF : INF;
- int &res = dp[x][y][f];
- if (res != NAN) return res;
- if (x == n - 1 && y == n - 1) return res = f ? c[x][y] : -c[x][y];
- if (f) {
- res = c[x][y] + min(solve(x + 1, y, f ^ 1), min(solve(x, y + 1, f ^ 1), solve(x + 1, y + 1, f ^ 1)));
- } else {
- res = -c[x][y] + max(solve(x + 1, y, f ^ 1), max(solve(x, y + 1, f ^ 1), solve(x + 1, y + 1, f ^ 1)));
- }
- return res;
- }
- int main() {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- scanf("%d", &c[n - 1 - i][j]);
- }
- }
- assert(c[0][0] == 0);
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- for (int l = 0; l < 2; l++)
- dp[i][j][l] = NAN;
- printf("%d\n", solve(0, 0, 0));
- }
Advertisement
Add Comment
Please, Sign In to add comment