hdu 3886 Final Kichiku “Lanlanshu” 数位DP

思路:

dp[i][j][k]:满足在字符串的j位,前一位数字是k。

代码如下:

 

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cmath>

 4 #include<algorithm>

 5 #include<cstring>

 6 #define ll long long

 7 #define M 100000000

 8 using namespace std;

 9 char str[101],a[101],b[101];

10 int len,bit[101],dp[101][101][10];

11 bool ok(int i,int u,int v)

12 {

13     if(str[i]=='/') return u<v;

14     if(str[i]=='-') return u==v;

15     if(str[i]=='\\') return u>v;

16 }

17 int dfs(int pos,int j,int pre,bool h,bool f)

18 {

19     if(pos==-1) return j==len;

20     if(!f&&dp[pos][j][pre]!=-1) return dp[pos][j][pre];

21     int ans=0;

22     int e=f?bit[pos]:9;

23     for(int i=0;i<=e;i++){

24         if(h) ans+=dfs(pos-1,j,i,h&&i==0,f&&i==e);

25         else if(j<len&&ok(j,pre,i)) ans+=dfs(pos-1,j+1,i,h,f&&i==e);

26         else if(j>0&&ok(j-1,pre,i)) ans+=dfs(pos-1,j,i,h,f&&i==e);

27         ans%=M;

28     }

29     if(!f) dp[pos][j][pre]=ans;

30     return ans;

31 }

32 int solve(char an[],bool f)

33 {

34     int m=0,i,j=0,le=strlen(an);

35     while(an[j]=='0') j++;

36     for(i=le-1;i>=j;i--) bit[m++]=an[i]-'0';

37     if(f&&m>0){

38         for(i=0;i<m;i++){

39             if(bit[i]){

40                 bit[i]--;

41                 break;

42             }

43             else bit[i]=9;

44         }

45     }

46     return dfs(m-1,0,0,1,1);

47 }

48 int main()

49 {

50     int i,j,k,m,n;

51     while(scanf("%s",str)!=EOF){

52         len=strlen(str);

53         scanf("%s%s",a,b);

54         memset(dp,-1,sizeof(dp));

55         printf("%08d\n",(solve(b,0)-solve(a,1)+M)%M);

56     }

57     return 0;

58 }
View Code

 

 

 

你可能感兴趣的:(final)