結果

提出番号 2244
提出者 taotao54321
言語 C++
提出日時 2019-08-19 04:00:46
問題名 (70)アルゴリズムのお勉強
結果 CE
点数 0%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 CE 0% 0ms 0KB
2 CE 0% 0ms 0KB
3 CE 0% 0ms 0KB
4 CE 0% 0ms 0KB
5 CE 0% 0ms 0KB
6 CE 0% 0ms 0KB
7 CE 0% 0ms 0KB
8 CE 0% 0ms 0KB
9 CE 0% 0ms 0KB
10 CE 0% 0ms 0KB
11 CE 0% 0ms 0KB
12 CE 0% 0ms 0KB
13 CE 0% 0ms 0KB
14 CE 0% 0ms 0KB
15 CE 0% 0ms 0KB
16 CE 0% 0ms 0KB
17 CE 0% 0ms 0KB
18 CE 0% 0ms 0KB
19 CE 0% 0ms 0KB
20 CE 0% 0ms 0KB
21 CE 0% 0ms 0KB
22 CE 0% 0ms 0KB
23 CE 0% 0ms 0KB
24 CE 0% 0ms 0KB
25 CE 0% 0ms 0KB
26 CE 0% 0ms 0KB
27 CE 0% 0ms 0KB
28 CE 0% 0ms 0KB
29 CE 0% 0ms 0KB
30 CE 0% 0ms 0KB

ソースコード

/**
 * 
 */

#include <iostream>
#include <vector>
#include <cstdint>
using namespace std;

constexpr long long INF  = 1'010'000'000'000'000'017LL;

#define FOR(i, start, end) for(long long i = (start); i < (end); ++i)
#define REP(i, n) FOR(i, 0, n)

//--------------------------------------------------------------------

void solve() {
    long long N; cin >> N;

    vector<long long> T(N);
    REP(i, N) { cin >> T[i]; }

    vector<vector<long long>> M(N, vector<long long>(N));
    REP(i, N) REP(j, N) {
        cin >> M[i][j];
    }

    vector<long long> dp(1LL<<N, INF);
    dp[0] = 0;

    REP(i, 1LL<<N) {
        REP(j, N) {
            if(i&(1LL<<j)) continue;
            long long t = T[j];
            REP(k, N) {
                if(i&(1LL<<k))
                    t -= M[k][j];
            }
            dp[i|(1LL<<j)] = min(dp[i|(1LL<<j)], t+dp[i]);
        }
    }

    long long ans = dp[(1LL<<N)-1];

    cout << ans << "\n";
}

signed main() {
    

    solve();

    return 0;
}