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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LightOJ1032 Fast Bit Calculations(数位DP)

發(fā)布時(shí)間:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LightOJ1032 Fast Bit Calculations(数位DP) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

顯然數(shù)位DP。

dp[i][j]表示所有末尾為j的i位二進(jìn)制數(shù)相鄰位的數(shù)量和

初始狀態(tài)dp[2][1]=1

從長(zhǎng)度i-1轉(zhuǎn)移到長(zhǎng)度i就是在i-1位的末尾添上0或1,轉(zhuǎn)移方程就是:

dp[i][0]=dp[i-1][0]+dp[i-1][1]

dp[i][1]=dp[i-1][0]+dp[i-1][1]+2i-2

預(yù)處理完后,就可以通過這個(gè)計(jì)算出[0,n]區(qū)間的數(shù)量和,還是感覺數(shù)位DP的這一步挺棘手的,具體問題具體分析吧。。

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 long long d[32][2]; 5 int main(){ 6 d[2][1]=1; 7 for(int i=3; i<32; ++i){ 8 d[i][0]=d[i-1][0]+d[i-1][1]; 9 d[i][1]=d[i-1][0]+d[i-1][1]+(1<<i-2); 10 } 11 int t; 12 long long n; 13 scanf("%d",&t); 14 for(int cse=1; cse<=t; ++cse){ 15 scanf("%lld",&n); 16 long long res=0; 17 for(int i=30; i>=0; --i){ 18 if((n>>i)&1) res+=d[i][0]+d[i][1]; 19 if(((n>>i)&1) && ((n>>i+1)&1)) res+=(n&((1LL<<i+2)-1))-((1<<i)|(1<<i+1))+1; 20 } 21 printf("Case %d: %lld\n",cse,res); 22 } 23 return 0; 24 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/WABoss/p/5127652.html

總結(jié)

以上是生活随笔為你收集整理的LightOJ1032 Fast Bit Calculations(数位DP)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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