针对集合的DP ——状态压缩DP
1 int dp[1<<MS][MS] 2 int edge[MS][MS]; 3 int n; 4 5 int calc(int s,int v) 6 { 7 if(dp[s][v]>=0) 8 return dp[s][v]; 9 if(s==(1<<n-1)&&v==0) 10 return dp[s][v]=0; 11 int res=INF; 12 for(int i=0;i<n;i++) 13 if(!(s&(1<<i))) 14 res=min(res,calc(s| 1<<i,i)+edge[v][i]); 15 return dp[s][v]=res; 16 } 17 18 void solve() 19 { 20 memset(dp,-1,sizeof(dp)); 21 printf("%d\n",calc(0,0)); 22 }
1 int dp[1<<MS][MS]; 2 3 void solve() 4 { 5 for(int s=0;s<1<<n;s++) 6 fill(dp[s],dp[s]+n,INF); 7 dp[(1<<n)-1][0]=0; 8 for(int s=(1<<n)-2;s>=0;s--) 9 { 10 for(int u=0;u<n;u++) 11 for(int v=0;v<n;v++) 12 if(!(s>>v&1)) 13 dp[s][u]=min(dp[s][u],dp[s|1<<v][v]+d[u][v]); 14 } 15 printf("%d\n",dp[0][0]); 16 }