結果

提出番号 1995
提出者 _ei1333
言語 C++
提出日時 2018-08-04 14:51:53
問題名 (70)アルゴリズムのお勉強
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8416KB
2 AC 100% 2ms 7632KB
3 AC 100% 2ms 8016KB
4 AC 100% 2ms 7824KB
5 AC 100% 2ms 8704KB
6 AC 100% 2ms 8400KB
7 AC 100% 2ms 8256KB
8 AC 100% 2ms 8128KB
9 AC 100% 2ms 8240KB
10 AC 100% 2ms 8288KB
11 AC 100% 2ms 8016KB
12 AC 100% 2ms 8416KB
13 AC 100% 2ms 7808KB
14 AC 100% 2ms 8128KB
15 AC 100% 2ms 8416KB
16 AC 100% 2ms 8416KB
17 AC 100% 2ms 8688KB
18 AC 100% 2ms 8048KB
19 AC 100% 3ms 8064KB
20 AC 100% 3ms 7248KB
21 AC 100% 2ms 8176KB
22 AC 100% 3ms 8720KB
23 AC 100% 2ms 8384KB
24 AC 100% 4ms 8240KB
25 AC 100% 2ms 8064KB
26 AC 100% 3ms 8176KB
27 AC 100% 4ms 8432KB
28 AC 100% 2ms 8336KB
29 AC 100% 12ms 8048KB
30 AC 100% 3ms 8432KB

ソースコード

#include <bits/stdc++.h>
#define rep(i, a, n) for(int i = a; i < n; i++)
#define int long long
#define chmin(a, b) a = min(a, b)
using namespace std;
typedef pair<int, int> P;
const int INF = 1e15;

int dp[1 << 16];

signed main(){
    int n;
    cin >> n;
    vector<int> t(n);
    rep(i, 0, n) cin >> t[i];
    vector<vector<int> > a(n, vector<int>(n));
    rep(i, 0, n) rep(j, 0, n) cin >> a[i][j];
    rep(i, 0, 1 << 16) dp[i] = INF;
    dp[0] = 0;
    for(int mask = 0; mask < (1 << n); mask++){
        rep(i, 0, n){
            if(mask & (1 << i)) continue;
            int tmp = t[i];
            rep(j, 0, n){
                if(mask & (1 << j)) tmp -= a[j][i];
            }
            chmin(dp[mask | (1 << i)], dp[mask] + tmp);
        }
    }
    cout << dp[(1 << n) - 1] << endl;
}