Hdu 2089 数位dp
来源:互联网 发布:梦幻西游mac版快捷键 编辑:程序博客网 时间:2024/03/29 16:25
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int m,n;int p[15];int f[15][3];int w;int dfs(int pos,int s,int e){ if(pos==0) { if(s==0||s==1)return 1; else return 0; } if(e==0&&f[pos][s]!=-1)return f[pos][s]; int ans=0; if(e) { for(int i=0;i<=p[pos];i++) { int ss; if(s!=2&&i==6)ss=1; else if(s==2||i==4||(s==1&&i==2))ss=2; else ss=0; if(i!=p[pos])ans+=dfs(pos-1,ss,0); else ans+=dfs(pos-1,ss,1); } } else { for(int i=0;i<10;i++) { int ss; if(s!=2&&i==6)ss=1; else if(s==2||i==4||(s==1&&i==2))ss=2; else ss=0; ans+=dfs(pos-1,ss,0); } } if(!e)f[pos][s]=ans; return ans;}int func(int x){ memset(f,-1,sizeof(f)); int r=x; w=0; while(r) { p[++w]=r%10; r/=10; } return dfs(w,0,1);}int main(){ while(scanf("%d%d",&m,&n)) { if(m==0&&n==0)break; if(m==0)cout<<func(n)<<endl; else cout<<func(n)-func(m-1)<<endl; } return 0;}