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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

HDU - 6899 Xor(数位dp)

發(fā)布時(shí)間:2024/4/11 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU - 6899 Xor(数位dp) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(diǎn)擊查看

題目大意:給出四個(gè)整數(shù) A , B , K , W ,問(wèn)滿足下列條件的二元對(duì)的個(gè)數(shù):

  • x , y 是整數(shù)
  • x <= A , y <= B
  • abs( x - y ) <= K
  • x xor y <= W
  • 題目分析:數(shù)位dp,如果按照二進(jìn)制進(jìn)行數(shù)位的話,除了第三個(gè)條件都比較容易實(shí)現(xiàn),所以對(duì)第三個(gè)條件進(jìn)行以下轉(zhuǎn)換,abs( x - y ) <= K ,去掉絕對(duì)值的話就能轉(zhuǎn)換為 x - y <= K && y - x <= K?,移一下項(xiàng)就是 x - y + K >= 0 && y - x + K >= 0,這樣我們現(xiàn)在就得到了五個(gè)條件,作為數(shù)位dp的五個(gè)狀態(tài):

  • f1:代表 x <= A
  • f1 == 0:x < A
  • f1 == 1:x = A
  • f2:代表 y <= B
  • f2 == 0:y < B
  • f2 == 1:y = B
  • f3:代表 x xor y <= W
  • f3 == 0:x xor y < W
  • f3 == 1:x xor y = W
  • v1:代表?x - y + K,v2:代表 y - x + K,取值為 -1 , 0 , 1
  • 重點(diǎn)解釋一下 v1 和 v2 的三個(gè)狀態(tài)吧,為什么要分成 -1 , 0 和 1 討論,因?yàn)檎麄€(gè)操作是在二進(jìn)制下進(jìn)行運(yùn)算的,所以 x , y , K ,都只能取 0 或 1 ,那么對(duì)于其中某一位的運(yùn)算來(lái)說(shuō),以 x - y + K?為例,其整體的最大值為 2 ,整體的最小值為 -1,又因?yàn)槭菑母呶坏降臀贿M(jìn)行的狀態(tài)轉(zhuǎn)移,每次得到的 v1 和 v2,傳遞到低位時(shí),需要乘以進(jìn)制,也就是需要乘以 2 才能換算為低位的實(shí)際數(shù)值,那么分類討論一下:

  • 上一次傳下來(lái)的 v1 小于等于 -2:乘以 2 后此時(shí) x - y + K 的值為 -4,無(wú)論如何取值都無(wú)法中和,越往下將會(huì)欠的越多,永遠(yuǎn)無(wú)法到達(dá) v1 >= 0 的狀態(tài)了
  • 上一次傳下來(lái)的 v1 等于 -1:乘以 2 后此時(shí)?x - y + K 的值為 -2 ,還有被中和為 0 的機(jī)會(huì)
  • 上一次傳下來(lái)的 v1 等于 0:顯然是一個(gè)合法狀態(tài)
  • 上一次傳下來(lái)的 v1 大于等于 1:乘以 2 后此時(shí) x - y + K 的值為 2,下面無(wú)論如何取值,x - y + K 的值都肯定滿足 v1 >= 0 的條件了,所以大于等于 1 的狀態(tài)都將其歸類為 1 的狀態(tài)即可,能節(jié)省大量空間
  • 實(shí)現(xiàn)的話就比較簡(jiǎn)單了

    代碼:
    ?

    //#pragma GCC optimize(2) //#pragma GCC optimize("Ofast","inline","-ffast-math") //#pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;LL dp[35][3][3][2][2][2];int A[35],B[35],K[35],W[35];LL dfs(int pos,int v1,int v2,int f1,int f2,int f3) {v1=min(v1,1);v2=min(v2,1);if(v1<-1||v2<-1)return 0;if(pos==-1)return v1>=0&&v2>=0;if(dp[pos][v1+1][v2+1][f1][f2][f3]!=-1)return dp[pos][v1+1][v2+1][f1][f2][f3];int upa=f1?A[pos]:1;int upb=f2?B[pos]:1;int upw=f3?W[pos]:1;LL ans=0;for(int i=0;i<=upa;i++)//枚舉A for(int j=0;j<=upb;j++)//枚舉B{if((i^j)>upw)continue;ans+=dfs(pos-1,v1*2+i-j+K[pos],v2*2+j-i+K[pos],f1&&i==upa,f2&&j==upb,f3&&(i^j)==upw);}return dp[pos][v1+1][v2+1][f1][f2][f3]=ans; }LL solve(int a,int b,int k,int w) {memset(dp,-1,sizeof(dp));for(int i=0;i<=30;i++){A[i]=a&1;a>>=1;B[i]=b&1;b>>=1;K[i]=k&1;k>>=1;W[i]=w&1;w>>=1;}return dfs(30,0,0,1,1,1); }int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);printf("%lld\n",solve(a,b,c,d));}return 0; }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的HDU - 6899 Xor(数位dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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