思路:
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 }