提出 #710444


ソースコード 拡げる

import java.util.Arrays;
import java.util.Scanner;

public class Main {

  Scanner sc;

  Main() {
    sc = new Scanner(System.in);
  }

  int ni() {
    return sc.nextInt();
  }

  public static void main(String[] args) {
    new Main().run();
  }

  int[][][][][][] memo;
  boolean[][][][][][] done;

  int dfs(int index, int limit, int jndex, int mimit, int turn, int pass) {
    if (pass == 3) {
      return 0;
    }
    if (done[turn][pass][index][limit][jndex][mimit]) {
      return memo[turn][pass][index][limit][jndex][mimit];
    }
    int add = sum[limit][index];
    int bdd = tum[mimit][jndex];

    if (turn == 0) {
      // player 1:max
      // 出す
      int U = -1 * (1 << 28);
      if (index < n) {
        int num = a[index];
        if (num == -1) {
          // 相手のカードを無効化
          mimit = jndex;
        }
        U = dfs(index + 1, limit, jndex, mimit, 1 - turn, 0);
      }
      // パス:limit to index
      int P = dfs(index, index, jndex, jndex, 1 - turn, pass + 1) + add - bdd;
      memo[turn][pass][index][limit][jndex][mimit] = Math.max(P, U);
    } else {
      // player 2:min
      // 出す
      int U = 1 << 28;
      if (jndex < m) {
        int num = b[jndex];
        if (num == -1) {
          // 相手のカードを無効化
          limit = index;
        }
        U = dfs(index, limit, jndex + 1, mimit, 1 - turn, 0);
      }
      // パス:limit to index
      int P = dfs(index, index, jndex, jndex, 1 - turn, pass + 1) + add - bdd;
      memo[turn][pass][index][limit][jndex][mimit] = Math.min(P, U);
    }

    done[turn][pass][index][limit][jndex][mimit] = true;
    return memo[turn][pass][index][limit][jndex][mimit];
  }

  int n, m;
  int N, M;
  int[] a, b;
  int[][] sum, tum;

  void run() {
    n = ni();
    m = ni();
    a = new int[n];
    b = new int[m];
    for (int i = 0; i < n; ++i) {
      a[i] = ni();
    }
    for (int i = 0; i < m; ++i) {
      b[i] = ni();
    }

    sum = new int[n + 1][n + 1];
    for (int i = 0; i <= n; ++i) {
      for (int j = i + 1; j <= n; ++j) {
        for (int k = i; k < j; ++k) {
          if (a[k] == -1) {
            continue;
          }
          sum[i][j] += a[k];

        }
      }
    }
    tum = new int[m + 1][m + 1];
    for (int i = 0; i <= m; ++i) {
      for (int j = i + 1; j <= m; ++j) {
        for (int k = i; k < j; ++k) {
          if (b[k] == -1) {
            continue;
          }
          tum[i][j] += b[k];
        }
      }
    }

    N = n + 1;
    M = m + 1;

    memo = new int[2][3][N][N][M][M];
    done = new boolean[2][3][N][N][M][M];
    for (int i = 0; i < N * N; ++i) {
      for (int j = 0; j < M * M; ++j) {
        for (int k = 0; k < 3; ++k) {
          memo[0][k][i / N][i % N][j / M][j % M] = -(1 << 28);
          memo[1][k][i / N][i % N][j / M][j % M] = 1 << 28;
        }
      }
    }

    System.out.println(dfs(0, 0, 0, 0, 0, 1));
  }

  void debug(Object... os) {
    System.err.println(Arrays.deepToString(os));
  }
}

提出情報

提出日時
問題 D - インビジブル
ユーザ tenpaku
言語 Java8 (OpenJDK 1.8.0)
得点 100
コード長 3133 Byte
結果 AC
実行時間 1457 ms
メモリ 279936 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 37
セット名 テストケース
All 00_sample_00, 00_sample_01, 00_sample_02, 30_random_small_000, 30_random_small_001, 30_random_small_002, 30_random_small_003, 30_random_small_004, 30_random_small_005, 30_random_small_006, 30_random_small_007, 30_random_small_008, 30_random_small_009, 31_random_skewed_000, 31_random_skewed_001, 31_random_skewed_002, 31_random_skewed_003, 31_random_skewed_004, 32_random_skewed_000, 32_random_skewed_001, 32_random_skewed_002, 32_random_skewed_003, 32_random_skewed_004, 33_random_frequent_invisible_000, 33_random_frequent_invisible_001, 33_random_frequent_invisible_002, 33_random_frequent_invisible_003, 33_random_frequent_invisible_004, 35_random_all_invisible_000, 36_random_all_same_score_000, 37_increasing_000, 38_decreasing_000, 40_random_max_000, 40_random_max_001, 40_random_max_002, 40_random_max_003, 40_random_max_004
ケース名 結果 実行時間 メモリ
00_sample_00 AC 197 ms 9544 KiB
00_sample_01 AC 204 ms 9552 KiB
00_sample_02 AC 211 ms 9548 KiB
30_random_small_000 AC 208 ms 10068 KiB
30_random_small_001 AC 208 ms 9676 KiB
30_random_small_002 AC 215 ms 9684 KiB
30_random_small_003 AC 202 ms 9680 KiB
30_random_small_004 AC 207 ms 9544 KiB
30_random_small_005 AC 217 ms 9808 KiB
30_random_small_006 AC 220 ms 9680 KiB
30_random_small_007 AC 203 ms 9680 KiB
30_random_small_008 AC 196 ms 9556 KiB
30_random_small_009 AC 202 ms 9428 KiB
31_random_skewed_000 AC 341 ms 33852 KiB
31_random_skewed_001 AC 338 ms 34108 KiB
31_random_skewed_002 AC 320 ms 34008 KiB
31_random_skewed_003 AC 255 ms 14896 KiB
31_random_skewed_004 AC 336 ms 34004 KiB
32_random_skewed_000 AC 278 ms 25476 KiB
32_random_skewed_001 AC 220 ms 9936 KiB
32_random_skewed_002 AC 284 ms 25348 KiB
32_random_skewed_003 AC 221 ms 9940 KiB
32_random_skewed_004 AC 218 ms 9936 KiB
33_random_frequent_invisible_000 AC 238 ms 12244 KiB
33_random_frequent_invisible_001 AC 732 ms 128204 KiB
33_random_frequent_invisible_002 AC 456 ms 62084 KiB
33_random_frequent_invisible_003 AC 226 ms 11856 KiB
33_random_frequent_invisible_004 AC 239 ms 12496 KiB
35_random_all_invisible_000 AC 260 ms 16704 KiB
36_random_all_same_score_000 AC 1422 ms 279936 KiB
37_increasing_000 AC 1427 ms 279740 KiB
38_decreasing_000 AC 1457 ms 279720 KiB
40_random_max_000 AC 1355 ms 275000 KiB
40_random_max_001 AC 1363 ms 274624 KiB
40_random_max_002 AC 1361 ms 274828 KiB
40_random_max_003 AC 1338 ms 274832 KiB
40_random_max_004 AC 1356 ms 275216 KiB