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
",(solve(b,0)-solve(a,1)+M)%M);
56     }
57     return 0;
58 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3336894.html