1. 程式人生 > >[HDU3252] [USACO06Nov,Silver] Round Number [數位dp]

[HDU3252] [USACO06Nov,Silver] Round Number [數位dp]

[ L i n k \frak{Link} ]


詢問[a,b]內二進位制表示中0的個數不小於1的個數的整數數量。
顯然是數位dp


最大的b30位。當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; }