【数位DP】 HDU 4734 F(x)
原题直通车: HDU 4734 F(x)
题意:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1, 求0.....B中F[x]<=F[A]的个数。
代码:
// 31MS 548K 931 B G++ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int digit[11], dp[11][6000], m; inline int set_m(int x) { int k=1; m=0; while(x>0) m+=(x%10)*k, x/=10, k*=2; } inline int dfs(int pos, int rt, bool limit) { if(!pos) return (rt>=0); if(!limit&&dp[pos][rt]!=-1) return dp[pos][rt]; int len=(limit?digit[pos]:9); int ret=0; for(int i=0; i<=len; ++i) { int a=rt-i*(1<<(pos-1)); if(a<0) break; ret+=dfs(pos-1, a, limit&&i==len); } if(!limit) dp[pos][rt]=ret; return ret; } inline int work(int x) { int len=0; while(x) digit[++len]=x%10, x/=10; return dfs(len, m, true); } int main() { int T, cas=1; scanf("%d",&T); memset(dp, -1, sizeof(dp)); while(T--) { int x, r; scanf("%d%d",&x, &r); set_m(x); printf("Case #%d: %d\n", cas++, work(r)); } return 0; }