HDU2089-不要62-数位DP水题

 

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int dp[10][2];
 5 int digit[10];
 6 //len 长度 state 是否上位为6 limit 是否达到上限
 7 //dfs的值为,在digit数组限制下长度为len的数字的ans
 8 int dfs(int len , int state , bool limit)
 9 {
10     // 如果找到个位数,则返回1
11     if (len == 0) return 1;
12     //如果dfs到当前位置,数位没有限制,并且记忆化处理过len长度的数,则返回dp内容
13     if (!limit && dp[len][state]!=-1)
14         return dp[len][state];
15     int tans = 0;
16     //判断当前曾枚举范围,是0-9还是0-digit[len]
17     int limitD = limit ? digit[len] : 9;
18     //枚举当前位数字
19     for (int i = 0 ; i <= limitD ; i++)
20     {
21         //如果枚举到4,或者state==1(即上一位为6的情况下)且枚举到2,那么不满足要求,跳过
22         if ( i==4 || (state == 1 && i == 2) ) continue;
23         //dfs,len位为i,数字长len-1 ans,
24         //len-1
25         //当前位为6,即len的上一位为 6
26         //上一位有限制,并且当前位有限制,那么不能直接返回长
27         tans += dfs(len-1 , i==6?1:0 , limit && i == digit[len]);
28     }
29     //如果是无限制的len长度的数字ans,那么存下来
30     if (!limit) dp[len][state] = tans;
31     return tans;
32 }
33 int solve(int x)
34 {
35     int cnt = 0;
36     while (x!=0)
37     {
38        digit[++cnt] = x % 10;
39        x/=10;
40     }
41     return dfs(cnt,0,true);
42 }
43 int main()
44 {
45     memset(dp,-1,sizeof dp);
46     int a,b;
47     while (cin >> a >> b && a+b!=0)
48     {
49         cout << solve(b) - solve(a-1) <<endl;
50     }
51 }

 

转载于:https://www.cnblogs.com/HITLJR/p/5965279.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值