| 提出番号 | 1659 |
|---|---|
| 提出者 | shot |
| 言語 | C++ |
| 提出日時 | 2018-08-04 13:23:45 |
| 問題名 | (70)アルゴリズムのお勉強 |
| 結果 | AC |
| 点数 | 100% |
| テストケース | 結果 | 得点 | 実行時間 | メモリ使用量 |
|---|---|---|---|---|
| 1 | AC | 100% | 1ms | 8704KB |
| 2 | AC | 100% | 1ms | 7824KB |
| 3 | AC | 100% | 2ms | 8176KB |
| 4 | AC | 100% | 2ms | 8704KB |
| 5 | AC | 100% | 2ms | 8448KB |
| 6 | AC | 100% | 2ms | 7968KB |
| 7 | AC | 100% | 2ms | 8144KB |
| 8 | AC | 100% | 1ms | 8304KB |
| 9 | AC | 100% | 2ms | 7904KB |
| 10 | AC | 100% | 2ms | 8000KB |
| 11 | AC | 100% | 2ms | 8720KB |
| 12 | AC | 100% | 2ms | 8272KB |
| 13 | AC | 100% | 2ms | 8432KB |
| 14 | AC | 100% | 2ms | 7824KB |
| 15 | AC | 100% | 2ms | 8416KB |
| 16 | AC | 100% | 2ms | 8080KB |
| 17 | AC | 100% | 2ms | 8416KB |
| 18 | AC | 100% | 2ms | 8400KB |
| 19 | AC | 100% | 2ms | 8448KB |
| 20 | AC | 100% | 2ms | 8272KB |
| 21 | AC | 100% | 2ms | 8128KB |
| 22 | AC | 100% | 2ms | 8448KB |
| 23 | AC | 100% | 2ms | 7520KB |
| 24 | AC | 100% | 4ms | 8672KB |
| 25 | AC | 100% | 2ms | 8720KB |
| 26 | AC | 100% | 3ms | 8096KB |
| 27 | AC | 100% | 4ms | 8720KB |
| 28 | AC | 100% | 2ms | 8112KB |
| 29 | AC | 100% | 13ms | 7248KB |
| 30 | AC | 100% | 3ms | 8448KB |
#include <bits/stdc++.h>
using namespace std;
#define int long long
int N;
vector<int> dp;
vector<int> t;
vector<vector<int> > a;
int dfs(int bit) {
if ( dp[bit] >= 0 ) return dp[bit];
if ( bit == (1<<N)-1 ) return 0;
int ret = (int)1e9;
for ( int i = 0; i < N; i++ ) {
if ( (1<<i) & bit ) continue;
int add = t[i];
for ( int j = 0; j < N; j++ ) {
if ( (1<<j) & bit ) add = max(0LL, add-a[j][i]);
}
ret = min(ret, dfs(bit|(1<<i))+add);
}
return dp[bit] = ret;
}
signed main() {
cin.tie(0);
ios_base::sync_with_stdio(0);
cout << fixed << setprecision(12);
cin >> N;
t = vector<int>(N);
for ( int i = 0; i < N; i++ ) cin >> t[i];
a = vector<vector<int> >(N, vector<int>(N));
for ( int i = 0; i < N; i++ ) {
for ( int j = 0; j < N; j++ ) cin >> a[i][j];
}
dp = vector<int>(1<<N, -1);
cout << dfs(0) << endl;
return 0;
}