HDU 2089
总感觉有一些东西的对的 所以只要往前走就是了 哈哈哈哈哈哈哈哈哈哈哈
数位DP第一道
#include<stdio.h> #include<algorithm> #include<string.h> #include<string> #include<vector> #include<queue> #include<iostream> #include<math.h> using namespace std; #define inf 1000000000 #define MAXN 110 int f[15][16]; void init() { f[0][0]=1; for(int i=1;i<=7;i++) { for(int j=0;j<10;j++) { for(int k=0;k<10;k++) { if(!(j==4||j==6&&k==2)) f[i][j]+=f[i-1][k]; } } } } int call(int n) { int cnt=0; while(n) { n=n/10; cnt++; } return cnt; } int dig[15]; void caldgt(int n,int len) { memset(dig,0,sizeof(dig)); for(int i=1;i<=len;i++) { dig[i]=n%10; n=n/10; } } int Ques(int n) { int ans=0; int len=call(n); //算长度 caldgt(n,len); //放到数组里面 //printf("%d\n",len); for(int i=len;i>=1;i--) { for(int j=0;j<dig[i];j++) { if(!(j==4||j==2&&dig[i+1]==6))//合法就加 { ans+=f[i][j]; // printf("%d\n",ans); } } if(dig[i]==4||dig[i]==2&&dig[i+1]==6) //模拟一下 就知道了 break; } return ans; } int main() { init(); int n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; printf("%d\n",Ques(m+1)-Ques(n)); //处理出来 0 - a 的 合法个数 } return 0; }
posted on 2017-02-27 20:19 HelloWorld!--By-MJY 阅读(160) 评论(0) 编辑 收藏 举报