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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

UVA - 1252 Twenty Questions (状压dp+vis数组加速)

發布時間:2025/7/25 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA - 1252 Twenty Questions (状压dp+vis数组加速) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有n個物品,每個物品有m個特征。隨機選擇一個物品讓你去猜,你每次可以詢問一個特征的答案,問在采取最優策略時,最壞情況下需要猜的次數是多少。

設siz[S]為滿足特征性質集合S的特征的物品總數,dp[S]為當前得到的物品特征信息為S的情況下最壞情況下需要猜多少次,則$dp[S]=max\{dp(S|(1<<(2*i))),dp(S|(2<<(2*i))\}$(為了表示某個特征不確定的狀態,需要將集合大小加倍)。dfs預處理siz的復雜度為$O(n*2^m)$,dp的復雜度為$O(m*3^m)$。

這道題我一開始總是迷之TLE,加了很多優化都失敗了,后來好不容易才發現原來是memset花的時間太長了,于是把vis數組的值換成了Case的值,這樣就可以避免每次都初始化了。然后時間從TLE直降到90ms,巨無語。。。

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll N=11,inf=0x3f3f3f3f; 5 int siz[(1<<(N*2))+10],d[(1<<(N*2))+10],n,k,vis[(1<<(N*2))+10],ka; 6 char s[100+10][N+5]; 7 int dp(int S) { 8 if(siz[S]==0)return 0; 9 if(siz[S]==1)return 0; 10 if(siz[S]==2)return 1; 11 int& ret=d[S]; 12 if(vis[S]==ka)return ret; 13 vis[S]=ka; 14 ret=inf; 15 for(int i=0; i<n; ++i)if((S>>(2*i)&3)==0)ret=min(ret,max(dp(S|(1<<(2*i))),dp(S|(2<<(2*i))))); 16 return ++ret; 17 } 18 19 void dfs(char* s,int u,int S) { 20 if(u==n) {siz[S]++; return;} 21 dfs(s,u+1,S); 22 if(s[u]=='0')dfs(s,u+1,S|(1<<(u*2))); 23 else if(s[u]=='1')dfs(s,u+1,S|(2<<(u*2))); 24 } 25 26 int main() { 27 memset(vis,0,sizeof vis); 28 while(scanf("%d%d",&n,&k)&&n) { 29 ++ka; 30 memset(siz,0,sizeof siz); 31 for(int i=0; i<k; ++i)scanf("%s",s[i]); 32 for(int i=0; i<k; ++i)dfs(s[i],0,0); 33 printf("%d\n",dp(0)); 34 } 35 return 0; 36 }

?

轉載于:https://www.cnblogs.com/asdfsag/p/10381301.html

總結

以上是生活随笔為你收集整理的UVA - 1252 Twenty Questions (状压dp+vis数组加速)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。