結果

提出番号 1840
提出者 yebityon
言語 C++
提出日時 2018-08-04 14:10:40
問題名 (70)アルゴリズムのお勉強
結果 AC
点数 100%

テストケース

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

ソースコード

#include<bits/stdc++.h>
using ll  = long long;
#define int ll
#define rep(i,n) for(int i=0;i<n;i++)
#define loop(i,s,n) for(int i=s;i<n;i++)
#define erep(e,v) for(auto && e :v)
#define all(in) in.begin(), in.end()
#define MP make_pair
#define INF (sizeof(int) == 4 ? 1e9:1e18)
#define EPS 0.0000000001
using namespace std;
template<class T, class S> void cmin(T &a, const S &b) { if (a > b)a = b; }
template<class T, class S> void cmax(T &a, const S &b) { if (a < b)a = b; }
template<typename Head, typename Value> auto vectors(const Head &head, const Value &v) { return vector<Value>(head, v); }
template<typename Head, typename... Tail> auto vectors(Head x, Tail... tail) { auto inner = vectors(tail...); return vector<decltype(inner)>(x, inner); }
template<class T> void join(T a){for(auto itr :a){if(itr != *a.begin())cout << " "; cout << itr;} }
using ld  = long double;
using pii = pair<int,int>;
using piii = pair<int,pii>;
int W,H;
int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};
bool valid(int x,int y){return (0<=x&&x<W)&&(0<=y&&y<H);}
signed main(){
    int n;
    cin >> n;
    vector<vector<int>>d(n+2,vector<int>(n+1,INF));
    vector<int>t(n);
    erep(e, t) cin >> e;
    rep(i,n)rep(j,n)cin >> d[i][j];
    vector<int>dp((1<<(n))+1,INF);
    dp[0]=0;
    for(int s=0; s<(1<<(n));s++){
        for(int v=0;v<n;v++){
            if(!(s>>v&1)){
                int mini=t[v];
                for(int u=0; u<n;u++){
                    if(s>>u&1)cmin(mini,mini - d[v][u]);
                }
                cmin(dp[s|1<<v],dp[s]+mini);
            }
        }
    }
    cout<<dp[(1<<(n))-1]<<endl;
}