日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu3006 状态压缩+位运算+hash(小想法题)

發(fā)布時間:2025/6/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu3006 状态压缩+位运算+hash(小想法题) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
? ? ? ?給了n個集合,問你這n個集合可以組合出多少種集合,可以自己,也可以兩個,也可以三個....也可以n個集合組在一起。


思路:

? ? ? 是個小想法題目,要用到二進制壓縮,位運算,還有hash,這4樣加起來說明這個題目真的很不錯,不廢話,首先對于每個集合有k個元素,每個元素都是不大于14的,那么我們可以二進制壓縮,把每個集合壓縮成一個二進制數(shù),壓縮過程設計到位運算對于每個集合
tmp = 0;
for(i ,1 - k) scanf(num) ,tmp = tmp | (1 << (num - 1));
hash[tmp] = 1;標記上當前的這個集合是可以得到的。
這樣最后的這個tmp就是當前的這個集合壓縮后的數(shù),然后我們在枚舉之前的所有可能狀態(tài),得到新的可能狀態(tài)(其實就是簡單dp)

for(i = 1 ;i < 1 << 14 ;i ++) if(hash[i]) hash[i|tmp] = 1; 之前的可能情況加上當

前的可能情況也是可能情況。最后在統(tǒng)計下可能情況的個數(shù)就ok了,
for(i = 1 ;i < 1 << 14 ;i ++) if(hash[i]) ans++;

做這個題目的時候sb了,開了個 hash[1<<13+1] 哎! 1<<13+1 != 1 << 14 - 1.


#include<stdio.h> #include<string.h> int hash[1 << 14];int main () {int n ,m ,i ,j ,k ,num ,tmp ,ans;while(~scanf("%d %d" ,&n ,&m)){memset(hash ,0 ,sizeof(hash));for(i = 1 ;i <= n ;i ++){scanf("%d" ,&k);tmp = 0;for(j = 1 ;j <= k ;j ++)scanf("%d" ,&num) ,tmp = tmp | (1 << (num - 1));hash[tmp] = 1;for(j = 0 ;j < 1 << 14 ;j ++)if(hash[j]) hash[tmp | j] = 1;}ans = 0;for(i = 0 ;i < 1 << 14 ;i ++)if(hash[i]) ans ++;printf("%d\n" ,ans);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的hdu3006 状态压缩+位运算+hash(小想法题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。