[HDU3252] [USACO06Nov,Silver] Round Number [數位dp]
阿新 • • 發佈:2018-10-31
詢問[a,b]內二進位制表示中0的個數不小於1的個數的整數數量。
顯然是數位dp 。
最大的b有30位。當1的數量超過b的位數的一半的時候就無解了。
注意處理好前導0。
小心不要給陣列下標為負的地方存東西。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cctype>
using namespace std;
int n,m;
int bit[35];
int F[35][70];
int dfs(int pos, int state, bool lead, bool limit) {
if(!pos) return state >= 35;
if(!lead && !limit && F[pos][state] != -1) return F[pos][state];
int ret = 0, up = limit ? bit[pos] : 1;
for(int i = 0; i <= up; ++i) {
ret += dfs(pos - 1, state + ( (i == 1) ? -1 : (lead ? 0 : 1) ), lead && i == 0, limit && i == up);
}
if(!lead && !limit) F[pos][state] = ret;
return ret;
}
int solve(int x) {
bit[0] = 0;
while(x) {
bit[++bit[0]] = x & 1;
x >>= 1;
}
return dfs(bit[0], 35, true, true);
}
int main() {
memset( F, -1, sizeof(F) );
scanf("%d%d", &n, &m);
printf( "%d", solve(m) - solve(n - 1) );
return 0;
}