针对集合的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 }

 

posted @ 2015-04-04 12:19  daydaycode  阅读(93)  评论(0编辑  收藏  举报