子集枚举
时间:2019-03-15 14:47:47
收藏:0
阅读:180
发现了一个很好玩的
可以枚举所有点对
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)