hdu 4734(数位dp)

来源:互联网 发布:淘宝十元包邮专区在哪 编辑:程序博客网 时间:2024/06/05 08:25

传送门
题解:找出i∈[0~b]且f(i)≤f(a)的数的个数。
设dp[i][j]表示当前从高往低在第i位,f(a)被减还剩下j的方案数。
看题花的时间比做题长。。。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int dp[11][19000],b[11];inline int f(int x) {    int ret=0,i=-1;    while (x) {        ret+=(x%10)*(1<<(++i)),x/=10;    }    return ret;}int dfs(int pos,int st,bool lim) {    if (!pos) return st>=0;    if (st<0) return 0;    if (!lim&&~dp[pos][st]) return dp[pos][st];    int end=lim?b[pos]:9,ans=0;    for (int i=0;i<=end;++i)        ans+=dfs(pos-1,st-i*(1<<(pos-1)),lim&&i==end);    if (!lim) dp[pos][st]=ans;    return ans;}inline int work(int x,int y) {    int len=0;    while (y) {        b[++len]=y%10,y/=10;    }    return dfs(len,f(x),1);}int main() {    memset(dp,-1,sizeof(dp));    int kase,CR7=0,a,b;    scanf("%d",&kase);    while (kase--) {        scanf("%d%d",&a,&b);        printf("Case #%d: %d\n",++CR7,work(a,b));    }    return 0;}
原创粉丝点击