Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- #define MAXN 100009
- #define INF 1000000007
- #define mp(x,y) make_pair(x,y)
- #define all(v) v.begin(),v.end()
- #define pb(x) push_back(x)
- #define wr cout<<"----------------"<<endl;
- #define ppb() pop_back()
- #define tr(ii,c) for(typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++)
- #define ff first
- #define ss second
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> PII;
- template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;}
- template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;}
- int arr[22][22];
- int n,k,ans=INF;
- int dp[(1<<20)+5],limit;
- int rec(int mask){
- if(mask==limit-1)
- return 0;
- int &ret=dp[mask];
- if(~ret)
- return ret;ret=INF;
- for(int i=0;i<n;i++)
- if(!(mask&(1<<i))){
- int res=INF;
- for(int k=0;k<n;k++)
- if((mask&(1<<k)))
- umin(res,arr[i][k]);
- umin(ret,rec(mask|(1<<i))+res);
- }
- return ret;
- }
- int main(){
- memset(dp,-1,sizeof dp);
- #ifndef ONLINE_JUDGE
- freopen("file.in", "r", stdin);
- #endif
- scanf("%d%d",&n,&k);
- for(int i=0;i<n;i++)
- for(int j=0;j<n;j++)
- scanf("%d",&arr[i][j]);
- limit=(1<<n);
- for(int i=1;i<limit;i++)
- if(__builtin_popcount(i)==k)
- umin(ans,rec(i));
- printf("%d\n",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment