Submission #725512

#TimeUsernameProblemLanguageResultExecution timeMemory
725512vjudge1Kronican (COCI16_kronican)C++17
90 / 100
2086 ms8532 KiB
#include <bits/stdc++.h>
using namespace std;

const int MN=21;
const int inf=1e9+7;

int n,k;
int board[MN][MN];
int dp[1<<MN];

int back(int bit){
//	cout<<bit<<endl;
	if(__builtin_popcount(bit)==k) return 0;
	if(dp[bit]>0) return dp[bit];
	
	int ans=inf;
	for(int i=1;i<=n;++i){
		if(!(bit&(1<<(i-1)))) continue;
		for(int j=1;j<=n;++j){
			if(i==j) continue;
			if(!(bit&(1<<(j-1)))) continue;
			
			ans=min(ans,board[j][i]+back(bit-(1<<(j-1))));
			ans=min(ans,board[i][j]+back(bit-(1<<(i-1))));
//			cout<<ans<<endl;
		}
	}
	return dp[bit]=ans;
}

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	memset(dp,-1,sizeof(dp));
	cin>>n>>k;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			cin>>board[i][j];
		}
	}
	
	cout<<back((1<<n)-1);
}
#Verdict Execution timeMemoryGrader output
Fetching results...