依旧是数位dp问题,这里只需要预处理dp数组为前i位,当前位填j的合法方案有多少种,
然后套数位dp的板子就行
#include<iostream> #include<vector> using namespace std; const int N=10; int f[N][10]; int n,m; void init(){ int i,j; for(i=0;i<=9;i++){ f[1][i]=i!=4?1:0; } int k; for(i=2;i<N;i++){ for(j=0;j<=9;j++){ if(j==4) continue; for(k=0;k<=9;k++){ if(k==4||(j==6&&k==2)) continue; f[i][j]+=f[i-1][k]; } } } } int dp(int n){ if(!n) return 1; vector<int> num; while(n){ num.push_back(n%10); n/=10; } int last=0; int res=0; for(int i=num.size()-1;i>=0;i--){ int x=num[i]; int j; for(j=0;j<x;j++){ if(j==4||(j==2&&last==6)) continue; res+=f[i+1][j]; } if((last==6&&x==2)||x==4) break; last=x; if(!i) res++; } return res; } int main(){ init(); while(cin>>n>>m){ if(n==0&&m==0) break; cout<<dp(m)-dp(n-1)<<endl; } return 0; }