子集枚举

时间:2019-03-15 14:47:47   收藏:0   阅读:51

发现了一个很好玩的

可以枚举所有点对

1 for(int i=0;i<n;i++)
2     for(int S=0;S<(1<<n);S++){
3         d[i][S]=INF;
4         for(int j=0;j<i;j++)
5             if(S&(1<<j)
6                 dp[i][S]=max(dp[i][S],dist(i,j)+dp[i-1][S^(1<<i)^(1<<j)];
7     }

 S表示状态,i和j表示不同的点,并且i和j的枚举不会重复,因为保证了j<i

对于每一个i

都有1<<n个S可以枚举

例如n=6

状态可以是:

000000

000001

000011

000111

010101

.......

1111111

S^(1<<i)^(1<<j)表示i,j不在该集合内

S&(1<<i)==true  表示第i位元素存在

 

评论(0
0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!