提出 #11897160


ソースコード 拡げる

#include <bits/stdc++.h>

#define rep(i, n) for (ll i = 0; i < (n); i++)
#define rep2(i, a, b) for (ll i = (a); i < (b); i++)
#define chmax(x, v) do { x = max(x, v); } while (0)
#define chmin(x, v) do { x = min(x, v); } while (0)
typedef uint64_t ull;
typedef int64_t ll;
typedef std::pair<ll, ll> PLL;

using namespace std;

ll N;
ll a[20][20];
ll sum[1000000]; // sum[S]: 集合Sに含まれる要素の和
ll dp[1000000]; // dp[S]: 集合Sの要素をグループ分けした時の得点の最大値

signed main() {
  cin >> N;
  rep(i, N) rep(j, N) cin >> a[i][j];
  for (ull S = 0; S < (1 << N); S++)
    for (int i=0; i<N; i++)
      for (int j=i+1; j<N; j++)
        if ((S & (1 << i)) && (S & (1 << j)))
          sum[S] += a[i][j];
  dp[0] = 0; // 空集合
  for (ull S = 1; S < (1 << N); S++) {
    dp[S] = sum[S];
    for (ull U = (S-1) & S; ; U = (U-1) & S) { // Sの真部分集合
      chmax(dp[S], dp[U] + sum[S - U]);
      if (U == 0) break;
    }
  }
  cout << dp[(1 << N) - 1] << endl;
  return 0;
}

提出情報

提出日時
問題 U - Grouping
ユーザ bobuhiro11
言語 C++14 (GCC 5.4.1)
得点 100
コード長 1058 Byte
結果 AC
実行時間 96 ms
メモリ 4864 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 24
セット名 テストケース
All 0_00, 0_01, 0_02, 0_03, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13, 1_14, 1_15, 1_16, 1_17, 1_18, 1_19
ケース名 結果 実行時間 メモリ
0_00 AC 2 ms 2304 KiB
0_01 AC 2 ms 2304 KiB
0_02 AC 2 ms 2304 KiB
0_03 AC 94 ms 4864 KiB
1_00 AC 1 ms 256 KiB
1_01 AC 94 ms 4864 KiB
1_02 AC 94 ms 4864 KiB
1_03 AC 94 ms 4864 KiB
1_04 AC 95 ms 4864 KiB
1_05 AC 95 ms 4864 KiB
1_06 AC 94 ms 4864 KiB
1_07 AC 96 ms 4864 KiB
1_08 AC 94 ms 4864 KiB
1_09 AC 96 ms 4864 KiB
1_10 AC 95 ms 4864 KiB
1_11 AC 95 ms 4864 KiB
1_12 AC 95 ms 4864 KiB
1_13 AC 96 ms 4864 KiB
1_14 AC 94 ms 4864 KiB
1_15 AC 96 ms 4864 KiB
1_16 AC 94 ms 4864 KiB
1_17 AC 95 ms 4864 KiB
1_18 AC 96 ms 4864 KiB
1_19 AC 95 ms 4864 KiB