hdu2089 不要62

//我写的第一个数位dp

//然而并不能理解

 1 #include<cstdio>

 2 #include<iostream>

 3 #include<cmath>

 4 #include<algorithm>

 5 #include<cstring>

 6 #include<cstdlib>

 7 #include<queue>

 8 #include<vector>

 9 #include<map>

10 #include<stack>

11 #include<string>

12 

13 using namespace std;

14 

15 int l,r;

16 int f[10][3];

17 //0 不包含

18 //1 不包含 首位为2

19 //2 包含

20 

21 int get_num(int x){

22     int t=0;

23     int tmp=x;

24     int ans=0;

25     int num[10];

26     bool flag=0;

27     memset(num,0,sizeof(num));

28     while (tmp!=0){

29             num[++t]=tmp%10;

30             tmp=tmp/10;

31     }

32     for (int i=t;i>=1;i--){

33             ans+=num[i]*f[i-1][2];

34             if (flag){

35                     ans=ans+num[i]*f[i-1][0];

36             }

37             else{

38                     if (num[i]>4) ans+=f[i-1][0];

39                     if (num[i+1]==6 && num[i]>2) ans+=f[i][1];

40                     if (num[i]>6) ans+=f[i-1][1];

41             }

42             if (num[i]==4 || (num[i+1]==6 && num[i]==2)) flag=true;

43     }

44     return x-ans;

45 }

46 

47 void INIT(){

48     memset(f,0,sizeof(f));

49     f[0][0]=1;

50     for (int i=1;i<=8;i++){

51             f[i][0]=f[i-1][0]*9-f[i-1][1];

52             f[i][1]=f[i-1][0];

53             f[i][2]=f[i-1][2]*10+f[i-1][1]+f[i-1][0];

54     }

55 }

56 

57 int main(){

58     INIT();

59     while (scanf("%d%d",&l,&r)==2){

60             if (l==0 && r==0) return 0;

61             printf("%d\n",get_num(r+1)-get_num(l));

62     }

63     return 0;

64 }

65 /*

66 1 100

67 0 0

68 */

 

你可能感兴趣的:(HDU)