题意:求n到m中有多少个数不含“4”和“62”
View Code
#include <stdio.h> #include <string.h> #define LEN 10 char a[LEN],b[LEN]; int n,m; int dp[LEN][3][2]; int nextstate(int cur,int in) { if(cur==2 || cur==1&&in==2 || in==4) return 2; return in==6; } int nextflag(int cur,int in,int max) { if(cur==1 && in==max) return 1; if(cur==1 && in>max) return -1; return 0; } int DP(char *s,int len) { memset(dp,0,sizeof(dp)); dp[0][0][1]=1; for(int i=1;i<=len;i++) { for(int state=0;state<3;state++) { for(int flag=0;flag<2;flag++) { for(int j=0;j<10;j++) { if(nextflag(flag,j,s[i]-'0')==-1) continue; dp[i][nextstate(state,j)][nextflag(flag,j,s[i]-'0')]+=dp[i-1][state][flag]; } } } } return dp[len][2][0]+dp[len][2][1]; } int main() { while(~scanf("%d%d",&n,&m)) { if(n==0 && m==0) break; n-=1; sprintf(a+1,"%d",n); sprintf(b+1,"%d",m); printf("%d\n",m-DP(b,strlen(b+1))-n+DP(a,strlen(a+1))); } return 0; }