不要62 HDU2089

Posted arrokoth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不要62 HDU2089相关的知识,希望对你有一定的参考价值。

http://acm.hdu.edu.cn/showproblem.php?pid=2089 

解题思路:
对于这道题,猛一看到脑袋里出现的就是暴力的做法,当然不能这样,会TLE。
打表是一定要打的。但是如何打的优美就是一个值得思考的问题了。这里我了解到一个很好的找数字里面有无62或4的方法。
我们可以将数字 n itoa 函数转换成字符串,然后用查询子串的方法找 n 中是否含有62、4。
说到打表,我们可以建立一个数组dp[n],来记录从1~n中出现62、4的数字。但是要注意一点的是,如果n中即包含62又包含4,那么我们这里还是只统计一次的。
 
代码:
 
 1 #include<math.h>
 2 #include<ctype.h>
 3 #include<stdlib.h>
 4 #include<stdio.h>
 5 #include<string.h>
 6 #include<limits.h>
 7 #include<stdlib.h>
 8 
 9 #define N 100010
10 #define fl 0x555555555
11 
12 typedef long long int ll;
13 
14 int dp[1000010];
15 char num[1000010];
16 int main()
17 {
18     int n, m;
19     int i;
20     memset(dp, 0, sizeof(dp));
21     for(i=1;i<=1000000;i++)
22     {
23         itoa(i, num, 10);
24         dp[i]=dp[i-1];             //将i前一个数字的统计值存入dp[i],以便后续的使用
25         if(strstr(num, "4")!=NULL)
26             dp[i]+=1;
27         else if(strstr(num, "62")!=NULL)  //如果字符串中已经出现过4的话就跳过这个语句了
28             dp[i]+=1;
29     }
30     while(scanf("%d%d", &n, &m), n||m )
31     {
32         printf("%d
", (m-n+1)-(dp[m]-dp[n-1]));  //输出n~m中不含4、62的数字的个数
33     }
34     return 0;
35 }

 

 

以上是关于不要62 HDU2089的主要内容,如果未能解决你的问题,请参考以下文章

hdu 2089 不要62 数位DP入门

HDU 2089 不要62

HDU 2089 不要62 (递推+暴力)

HDU 2089 不要62

HDU 2089 不要62

HDU 2089 —— 不要62