寒假Day20:数位dp

左心房为你撑大大i 提交于 2020-02-05 00:07:43

数位dp:在数位上做动态规划

Bomb

 HDU - 3555 

求含49的数字个数(49连号)。

 

 

不要62

 HDU - 2089 

 给出a、b两个区间,求所有不含有4或62(62连号)的数字的个数。

AC代码:

 1 #include<string.h>
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<vector>
 7 #include<map>
 8 #include<cmath>
 9 using namespace std;
10 #define inf 0x3f3f3f3f
11 const int N=50;
12 typedef long long ll;
13 
14 int digit[25];
15 ll dp[N][2];
16 
17 ll dfs(int len,bool if6,bool limit)
18 {
19     if(len==0)
20         return 1;
21     if(limit==0&&dp[len][if6])
22         return dp[len][if6];
23     ll cnt=0,up;
24     if(limit==1)
25         up=digit[len];
26     else
27         up=9;
28     for(int i=0; i<=up; i++)
29     {
30         if(if6&&i==2)//不要62
31             continue;
32         if(i==4)//不要4
33             continue;
34         cnt+=dfs(len-1,i==6,limit&&i==up);
35     }
36     if(limit==0)
37         dp[len][if6]=cnt;
38     return cnt;
39 }
40 
41 ll solve(ll x)
42 {
43     int num=0;
44     while(x)
45     {
46         digit[++num]=x%10;
47         x/=10;
48     }
49     return dfs(num,0,1);
50 }
51 
52 int main()
53 {
54     ll n,m;
55     while(cin>>n>>m)
56     {
57         if(n==0&&m==0)
58             break;
59         memset(dp,0,sizeof(dp));
60         cout<<solve(m)-solve(n-1)<<endl;
61     }
62     return 0;
63 }
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!