LightOJ1032 Fast Bit Calculations(数位DP)
生活随笔
收集整理的這篇文章主要介紹了
LightOJ1032 Fast Bit Calculations(数位DP)
小編覺(jué)得挺不錯(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ù)處理完后,就可以通過(guò)這個(gè)計(jì)算出[0,n]區(qū)間的數(shù)量和,還是感覺(jué)數(shù)位DP的這一步挺棘手的,具體問(wèn)題具體分析吧。。
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èn)題。
- 上一篇: 多态基类与虚析构函数
- 下一篇: 【数组】Find Peak Elemen