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

 

转载于:https://www.cnblogs.com/yours1103/p/3324143.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值