HDU 3886
一开始又往打表想了。。。。不过,打表确实不好处理,转DFS。
DFS有几个要注意的问题,1、对于枚举以零开始的数。我纠结了很久,最终学习别人的方法,设一个BOOL,并且假设最高一位有零,很方便。2、当枚举到字符串最后一位的情况3、对于连续的相同字符的处理,可以当一符合字符位置移动时,枚举的指针立即移动
呃。。我的不知为何WA了。。
#include <iostream> #include <cstdio> #include <cmath> #include <string.h> #include <algorithm> #define M 100000000 using namespace std; const int N=110; int dp[N][N][10]; char A[N],B[N]; char str[N]; int digit[N],lenstr; bool judge(int i,int u,int v){ if(str[i]=='/') return u<v; if(str[i]=='-') return u==v; if(str[i]=='\\') return u>v; } int dfs(int len,int pos,int k,bool zero,bool flag){ if(len==0){ return pos==lenstr+1; } if(!flag&&dp[len][pos][k]!=-1) return dp[len][pos][k]; int en=flag?digit[len]:9; int ans=0; for(int i=0;i<=en;i++){ if(zero) ans=(ans+dfs(len-1,pos,i,zero&&i==0,flag&&i==en)); else if(pos<=lenstr&&judge(pos,k,i)) ans=(ans+dfs(len-1,pos+1,i,zero,flag&&i==en)); else if(pos>1&&judge(pos-1,k,i)) ans=(ans+dfs(len-1,pos,i,zero,flag&&i==en)); ans%=M; } if(!flag) dp[len][pos][k]=ans; return ans; } int cal(char *s,bool f){ int l=strlen(s+1); int len=0; for(int i=l;i;i--){ digit[++len]=s[i]-'0'; } while(digit[len]==0) len--; lenstr=strlen(str+1); if(f&&len>1){ for(int i=1;i<=len;i++){ if(digit[i]){ digit[i]--; break; } else digit[i]=9; } } return dfs(len,1,0,true,true); } int main(){ while(scanf("%s",str+1)!=EOF){ cin>>A+1>>B+1; cout<<B+1<<endl; memset(dp,-1,sizeof(dp)); printf("%08d\n",((cal(B,false)-cal(A,true))+M)%M); } return 0; }
COPY别人的过的,就是这篇启发我处理前导零的问题
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #define ll long long #define M 100000000 using namespace std; char str[101],a[101],b[101]; int len,bit[101],dp[101][101][10]; bool ok(int i,int u,int v) { if(str[i]=='/') return u<v; if(str[i]=='-') return u==v; if(str[i]=='\\') return u>v; } int dfs(int pos,int j,int pre,bool h,bool f) { if(pos==-1) return j==len; if(!f&&dp[pos][j][pre]!=-1) return dp[pos][j][pre]; int ans=0; int e=f?bit[pos]:9; for(int i=0;i<=e;i++){ if(h) ans+=dfs(pos-1,j,i,h&&i==0,f&&i==e); else if(j<len&&ok(j,pre,i)) ans+=dfs(pos-1,j+1,i,h,f&&i==e); else if(j>0&&ok(j-1,pre,i)) ans+=dfs(pos-1,j,i,h,f&&i==e); ans%=M; } if(!f) dp[pos][j][pre]=ans; return ans; } int solve(char an[],bool f) { int m=0,i,j=0,le=strlen(an); while(an[j]=='0') j++; for(i=le-1;i>=j;i--) bit[m++]=an[i]-'0'; if(f&&m>0){ for(i=0;i<m;i++){ if(bit[i]){ bit[i]--; break; } else bit[i]=9; } } return dfs(m-1,0,0,1,1); } int main() { int i,j,k,m,n; while(scanf("%s",str)!=EOF){ len=strlen(str); scanf("%s%s",a,b); memset(dp,-1,sizeof(dp)); printf("%08d\n",(solve(b,0)-solve(a,1)+M)%M); } return 0; }