HDU 2089 不要62 (数位DP)
①递归实现
#include<iostream> #include<cstring> #define ll long long using namespace std; int dp[15][10],digit[15]; void init(){ memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=7;i++){ for(int j=0;j<=9;j++){ for(int k=0;k<=9;k++){ if (j != 4 && !(j == 6 && k == 2)) dp[i][j]+=dp[i-1][k]; } } } /*for(int i=0;i<=9;i++){ for(int j=0;j<=9;j++){ cout<<dp[i][j]<<' '; } cout<<endl; }*/ } int solve(int x){ memset(digit,0,sizeof(0)); int cnt=0,tmp=x; while(tmp){ digit[++cnt]=tmp%10; tmp/=10; } digit[cnt+1]=0; int ans=0; for(int i=cnt;i>=1;i--){//从高位向地位; for(int j=0;j<digit[i];j++)//由于j<digit[i],所以到最后一位时直接跳过了(即没有判断x),因此后面是m+1和n if(digit[i+1]!=6||j!=2) ans+=dp[i][j]; if(digit[i]==4||(digit[i+1]==6&&digit[i]==2))//遇到4或者62直接结束循环; break; } return ans; } int n,m; int main(){ init(); while(cin>>n>>m){ if(!n&&!m) break; cout<<solve(m+1)-solve(n)<<endl;//不是solve(m)-solve(n-1); } return 0; }