結果

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

テストケース

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

ソースコード

// 基本テンプレート
 
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
using namespace std;
 
#define rep(i,a,n) for(int (i)=(a); (i)<(n); (i)++)
#define repq(i,a,n) for(int (i)=(a); (i)<=(n); (i)++)
#define repr(i,a,n) for(int (i)=(a); (i)>=(n); (i)--)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define int long long int
 
template<typename T> void chmax(T &a, T b) {a = max(a, b);}
template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chadd(T &a, T b) {a = a + b;}
 
typedef pair<int, int> pii;
typedef long long ll;
 
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
const ll INF = 1001001001001001LL;
const ll MOD = 1000000007LL;
 
int dp[1 << 16], A[20][20];

signed main() {
    int N; cin >> N;
    vector<int> T(N);
    for(int i=0; i<N; i++) {
        cin >> T[i];
    }

    for(int i=0; i<N; i++) {
        for(int j=0; j<N; j++) {
            cin >> A[i][j];
        }
    }

    fill(dp, dp + (1 << N), INF);
    dp[0] = 0;

    for(int bit=0; bit<(1<<N); bit++) {
        for(int i=0; i<N; i++) {
            if(bit >> i & 1) continue;
            int nbit = bit | (1 << i);

            int work_t = T[i];
            for(int k=0; k<N; k++) {
                if(bit >> k & 1) {
                    work_t = max(0LL, work_t - A[k][i]);
                }
            }
            chmin(dp[nbit], dp[bit] + work_t);
        }
    }

    int fullbit = (1 << N) - 1;
    cout << dp[fullbit] << endl;
    return 0;
}