結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8672KB
2 AC 100% 2ms 8640KB
3 AC 100% 1ms 8112KB
4 AC 100% 2ms 7552KB
5 AC 100% 2ms 7968KB
6 AC 100% 2ms 8048KB
7 AC 100% 2ms 7984KB
8 AC 100% 2ms 8432KB
9 AC 100% 2ms 8416KB
10 AC 100% 2ms 7776KB
11 AC 100% 3ms 7552KB
12 AC 100% 2ms 8736KB
13 AC 100% 3ms 8416KB
14 AC 100% 3ms 8416KB
15 AC 100% 2ms 8192KB
16 AC 100% 2ms 7904KB
17 AC 100% 2ms 8064KB
18 AC 100% 2ms 7248KB
19 AC 100% 4ms 8176KB
20 AC 100% 4ms 8448KB
21 AC 100% 1ms 8352KB
22 AC 100% 8ms 7648KB
23 AC 100% 2ms 8432KB
24 AC 100% 17ms 8448KB
25 AC 100% 6ms 8144KB
26 AC 100% 8ms 7600KB
27 AC 100% 16ms 7824KB
28 AC 100% 4ms 7840KB
29 AC 100% 71ms 18016KB
30 AC 100% 7ms 7808KB

ソースコード

#include <algorithm>
#include <cassert>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>


using namespace std;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;

#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
#define FOR(i,a,b) for(int i = (a); i < (int)(b); ++i)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(v) ((int)v.size())

#define pb push_back
#define mp make_pair
#define mt make_tuple

int N; // 頂点数

vector<int> Ts;
vector<vector<int>> As;

vector<vector<int>> dp;

int INF = 1e9;

// S: これまでたどった頂点  v: 今いる頂点
ll rec(int S, int v) {
    if (dp[S][v] >= 0) return dp[S][v];
    if (S == (1 << N) - 1) {
        return dp[S][v] = 0;
    }

    ll res = INF;
    REP(u, N) {  // vの次に行く頂点をuとする
        if (!(S & (1 << u))) { // uに未訪問の場合
            int need = Ts[u];
            // 勉強済みのがあるか?
            REP(n, N) {
                if (S & (1 << n)) {
                    need -= As[n][u];
                }
            }
            need = max(0, need);
            
            auto tmp = need + rec(S | (1 << u), u);
            res = min(res, tmp);
        }
    }
    //cout << "dp[";
    //    REP(u, N) {
    //        cout << ((S & (1 << u)) ? "1" : "0");
    //    }
    //    cout << "][" << v << "] = " << res << endl;
    return dp[S][v] = res;
}

int main(){
    cin >> N;
    Ts.resize(N);
    As.resize(N, vector<int>(N));
    REP(n, N) cin >> Ts[n];
    REP(n1, N) REP(n2, N) cin >> As[n1][n2];

    // dp用のテーブル
    dp.resize(1<<N, vector<int>(N, -INF));

    cout << rec(0, 0) << endl;
    return 0;
}