結果

提出番号 1614
提出者 nebukuro09
言語 C++
提出日時 2018-08-04 13:16:43
問題名 (70)アルゴリズムのお勉強
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8064KB
2 AC 100% 2ms 8720KB
3 AC 100% 2ms 8064KB
4 AC 100% 2ms 8448KB
5 AC 100% 2ms 8704KB
6 AC 100% 2ms 7632KB
7 AC 100% 2ms 8352KB
8 AC 100% 2ms 7520KB
9 AC 100% 3ms 8176KB
10 AC 100% 2ms 7520KB
11 AC 100% 2ms 8432KB
12 AC 100% 2ms 8432KB
13 AC 100% 2ms 8432KB
14 AC 100% 2ms 8688KB
15 AC 100% 2ms 8448KB
16 AC 100% 2ms 8000KB
17 AC 100% 2ms 8032KB
18 AC 100% 2ms 8720KB
19 AC 100% 2ms 7792KB
20 AC 100% 2ms 7792KB
21 AC 100% 2ms 8432KB
22 AC 100% 5ms 8064KB
23 AC 100% 2ms 8448KB
24 AC 100% 5ms 8448KB
25 AC 100% 2ms 8256KB
26 AC 100% 2ms 8352KB
27 AC 100% 4ms 7760KB
28 AC 100% 2ms 7984KB
29 AC 100% 12ms 8144KB
30 AC 100% 3ms 7248KB

ソースコード

#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for (int i=0;i<(n);i++)
#define REP2(i,m,n) for (int i=m;i<(n);i++)
typedef long long ll;
typedef long double ld;

const int INF = 1 << 29;
int T[20];
int A[20][20];
int dp[1<<16];

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);

    int N; cin >> N;
    REP(i, N) cin >> T[i];
    REP(i, N) REP(j, N) cin >> A[i][j];

    REP(i, 1<<N) dp[i] = INF;
    dp[0] = 0;

    REP(mask, 1<<N) {
        REP(i, N) {
            if (mask & (1 << i)) continue;
            int tmp = 0;
            REP(j, N) if (mask & (1 << j)) tmp += A[j][i];
            dp[mask|(1<<i)] = min(dp[mask|(1<<i)], dp[mask] + T[i] - tmp);
        }
    }

    cout << dp[(1<<N)-1] << endl;
}