HDU 4734

数位dp题;也是我做的第一个数位dp的题目;

感觉数位dp的模板性很强啊,思想都差不太多!

有几个写的很好的参考资料:

推荐一下:

数位计数问题解法研究

浅谈数位类统计问题

我的代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #define maxn 16
 4 #define ll long long
 5 using namespace std;
 6 
 7 int dp[maxn][5000];
 8 int d[maxn],sum;
 9 
10 ll dfs(int w,int he,bool flag)
11 {
12     if(he<0)return 0;
13     if(!w)return 1;
14     if(!flag&&dp[w][he]!=-1) return dp[w][he];
15     int ff=flag?d[w]:9;
16     ll ret=0;
17     for(int i=0; i<=ff; i++)
18         ret+=dfs(w-1,he-i*(1<<(w-1)),flag&&i==ff);
19     if(!flag)dp[w][he]=ret;
20     return ret;
21 }
22 
23 ll calc(ll b)
24 {
25     memset(d,0,sizeof d);
26     int n=0;
27     while(b)
28     {
29         d[++n]=b%10;
30         b/=10;
31     }
32     return dfs(n,sum,true);
33 }
34 
35 int getsum(ll a)
36 {
37     int s=0,ji=1;
38     while(a)
39     {
40         s+=((a%10)*ji);
41         a/=10;
42         ji<<=1;
43     }
44     return s;
45 }
46 
47 int main()
48 {
49     int t,ca=1;
50     long long a,b;
51     scanf("%d",&t);
52     memset(dp,-1,sizeof dp);
53     while(t--)
54     {
55         scanf("%I64d%I64d",&a,&b);
56         sum=getsum(a);
57         printf("Case #%d: %I64d\n",ca++,calc(b));
58     }
59     return 0;
60 }
View Code

 

posted @ 2013-09-16 14:00  Yours1103  阅读(213)  评论(0编辑  收藏  举报