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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

codeforces1208 F. Bits And Pieces(SOS DP)

發布時間:2023/12/3 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces1208 F. Bits And Pieces(SOS DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

heyuhhh高維前綴和總結
SOS DP
SOS Dynamic Programming [Tutorial]
之前寫過相關的題目枚舉子集dp


枚舉子集

F[mask]=∑i∈maskA[i],i&mask=iF[mask]=\sum_{i\in mask}A[i],i\&mask=iF[mask]=imask?A[i],i&mask=i
方法1,O(4n)O(4^n)O(4n)暴力枚舉

for(int mask=0;mask<1<<N;mask++)for(int i=0;i<1<<n;i++)if(i&mask==i) F[mask]+=A[i];

方法2,O(3n)O(3^n)O(3n)枚舉子集

for(int mask=0;mask<1<<N;mask++) {F[mask]=A[0];for(int i=mask;i;i=(i-1)&mask)F[mask]+=F[i]; }

方法3,O(n×2n)O(n×2^n)O(n×2n)SOS dp

// 遞推版本 for(int mask=0;mask<1<<N;mask++) {dp[mask][-1]=A[mask];for(int i=0;i<N;i++){if(mask>>i&1) dp[mask][i]=dp[mask][i-1]+dp[mask^(1<<i)][i-1];elsedp[mask][i]=dp[mask][i-1];}F[mask]=dp[mask][N-1]; } // 不難發現第二維狀態可以滾動數組優化掉 for(int i=0;i<1<<N;i++) F[i]=A[i]; for(int i=0;i<N;i++)for(int mask=0;mask<1<<N;mask++)if(mask>>i&1)F[mask]+=F[mask^(1<<i)];

F. Bits And Pieces

issue敲膩害題解
fmaskf_{\text{mask}}fmask?mask\text{mask}mask的超集個數
iiimask\text{mask}mask的超集說明mask&i=mask\text{mask}\&i=\text{mask}mask&i=mask

如果fmask≥2f_{\text{mask}}\ge 2fmask?2說明存在aj&ak=maska_j\&a_k=maskaj?&ak?=mask

從后往前枚舉aia_iai?維護aj&aka_j\&a_kaj?&ak?

超集個數只需要在加入aia_iai?時把它的所有子集個數加一即可。枚舉子集可以利用SOS DP優化。

貪心從高位往低位選擇即可。

#include<iostream> #include<algorithm> using namespace std; constexpr int N=2000010; int f[N],a[N],n; void add(int x,int bit) {if(f[x]>=2)return;if(bit<0) return f[x]++,void();add(x,bit-1);if(x>>bit&1) add(x^(1<<bit),bit-1); } int calc(int x) {int ans=0,tmp=0;for(int i=20;i>=0;i--){if(x>>i&1) ans+=1<<i;else{if(f[tmp+(1<<i)]>=2) tmp+=1<<i,ans+=1<<i;}}return ans; } int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int ans=0;for(int i=n;i>=1;i--){if(i<=n-2) ans=max(ans,calc(a[i]));add(a[i],20);}cout<<ans<<'\n';return 0; }

總結

以上是生活随笔為你收集整理的codeforces1208 F. Bits And Pieces(SOS DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

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