Submission #317321

#TimeUsernameProblemLanguageResultExecution timeMemory
317321fadi57Kronican (COCI16_kronican)C++14
100 / 100
803 ms8576 KiB
#include <bits/stdc++.h> using namespace std; const long long mx=21; const long long mod=1e9+7; typedef long long ll; int a[mx][mx]; int dp[1<<mx];int k;int n,m; int solve(int mask){ if (__builtin_popcount(mask) == k) return 0; int &ret=dp[mask]; if(ret!=-1){return ret;} ret=1<<30; for(int i=0;i<n;i++){ if(!(mask&(1<<i))){continue;} for(int j=0;j<n;j++){ if(i==j){continue;} if(!(mask&(1<<j))){continue;} ret=min(ret,solve(mask^(1<<i))+a[i][j]); } } return ret; } int main() { memset(dp,-1,sizeof(dp)); cin>>n>>k; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>a[i][j];//cout<<a[i][j]; } } int all=(1<<n)-1;int ans=1<<30; dp[all]=0; for(int mask=all;mask>=1;mask--){ if(__builtin_popcount(mask)==k){ans=min(ans,dp[mask]);} for(int i=0;i<n;i++){ if(!((1<<i)&mask)){ continue; } for(int j=0;j<n;j++){ if(!((1<<j)&mask)){ continue; } if(i==j){continue;} int mask2=mask^(1<<i); // dp[mask2]=min(dp[mask2],dp[mask]+a[i][j]); // f[nmsk] = (f[nmsk] == -1 ? f[msk] + a[i][j] : min(f[nmsk], f[msk] + a[i][j])); dp[mask2]=(dp[mask2]==-1?dp[mask]+a[i][j]:min(dp[mask2],dp[mask]+a[i][j])); } } } cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...