ZOJ2898搜尋最佳化

來源:互聯網
上載者:User

這題暴力複雜度是O(2^n)的,對於24的複雜度明顯不可做,我的方法是進行最佳化,枚舉前n/2個,得到每個陷阱對應的寶物編號,這樣對應了一個映射,然後枚舉剩下的寶物,找到對應陷阱所對應的前半部分寶物,所有寶物的價值之和就是目前的答案,取最大的即可。

 

寶物和陷阱可以用int和long long壓縮,最後放入map中。複雜度O(2^(n/2))

 

My Code:

#include <cstring><br />#include <cstdio><br />#include <cstdlib><br />#include <vector><br />#include <map><br />#include <algorithm></p><p>using namespace std;</p><p>vector<int> trap[25];<br />int v[25];<br />int n,maxd;<br />map<long long,vector<int> > mp;<br />int ret;</p><p>void run(int st,long long val){<br />int ans,nst;<br />vector<int> part;</p><p>if(mp.find(val)==mp.end())<br />return;<br />part=mp[val];<br />int m=part.size();<br />for(int k=0;k<m;k++){<br />nst=st|part[k];<br />ans=0;<br />for(int i=0;i<n;i++){<br />if(nst&(1<<i)){<br />ans+=v[i];<br />}<br />}<br />if(ans>ret)<br />ret=ans;<br />}<br />}</p><p>void dfs(int k,int st,long long val){<br />int nst;<br />long long nval;</p><p>if(k==maxd){<br />if(mp.find(val)==mp.end()){<br />vector<int> v;<br />v.push_back(st);<br />mp[val]=v;<br />}else{<br />mp[val].push_back(st);<br />}<br />return;<br />}</p><p>int m=trap[k].size();<br />dfs(k+1,st,val);<br />nst=st;<br />nval=0;<br />nst|=(1<<k);<br />for(int i=0;i<m;i++){<br />nval|=(1ll<<trap[k][i]);<br />}<br />dfs(k+1,nst,val^nval);<br />}</p><p>void dfs2(int k,int st,long long val){<br />int nst;<br />long long nval;</p><p>if(k==n){<br />run(st,val);<br />return;<br />}</p><p>int m=trap[k].size();<br />dfs2(k+1,st,val);<br />nst=st;<br />nval=0;<br />nst|=(1<<k);<br />for(int i=0;i<m;i++){<br />nval|=(1ll<<trap[k][i]);<br />}<br />dfs2(k+1,nst,val^nval);<br />}</p><p>int main(){<br />int m,x;</p><p>while(~scanf("%d",&n)){<br />mp.clear();<br />ret=0;<br />for(int i=0;i<n;i++){<br />trap[i].clear();<br />scanf("%d%d",&v[i],&m);<br />for(int j=0;j<m;j++){<br />scanf("%d",&x);<br />trap[i].push_back(x);<br />}<br />}<br />maxd=n/2;<br />dfs(0,0,0ll);<br />dfs2(maxd,0,0ll);<br />printf("%d/n",ret);<br />}</p><p>return 0;<br />}<br />

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.