题意:不要62 和 4;
思路:dp[i][0] : 表示 前i 位 首位是4的不吉利数个数
dp[i][1]: 表示前i位第i+1位是6的不吉利数个数;
dp[i][2] : 表示前i位含不吉利数个数
eg:
n=100,a[1]=0,a[2]=0,a[3]=1;
dp[1][0] = 1 即为4;
dp[1][1]=2 62,64;
dp[1][2]= 10 40,41,42,43,44,45,46,47,48,49;
dp[2][0]=20 = dp[1][0]+dp[1][1]+dp[1][2]+14,24,34,54,74,84,94;
#include<stdio.h> #include<algorithm> #include<string> #include<string.h> #include<iostream> using namespace std; int a[20]; int dp[20][3]; int dfs(int pos, int st, bool flag) { if(pos == 0) return st == 2; if(flag && dp[pos][st] != -1) return dp[pos][st]; int ans = 0; int u = flag ? 9 : a[pos]; for(int i = 0; i <= u; i++) { if(st == 2 || i == 4 || (st == 1 && i == 2)) ans += dfs(pos-1, 2, flag || i < u); else if(i == 6) ans += dfs(pos-1, 1, flag || i < u); else ans += dfs(pos-1, 0,flag || i < u); } if(flag) dp[pos][st] = ans; return ans; } int cal(int n) { int len = 0; while(n) { a[++len] = n % 10; n /= 10; } return dfs(len, 0, 0); } int main() { int n,m; memset(dp, -1, sizeof(dp)); while(~scanf("%d%d",&n, &m)) { if(n == 0 && m == 0) return 0; printf("%d\n",m - n + 1 - cal(m) + cal(n-1)); } return 0; }