結果

提出番号 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;
}