https://cn.vjudge.net/problem/HDU-2089
题意:
题意:给定一个区间,求区间中不包含4、连续的62的数字有几个。
分析:基础的数位dp,利用开多维的dp数组和 dfs 的多个参数来实现各种限制条件,从高位到低位dfs,并且多用 if 判断,结尾 return 1。 ( 用dig[] 保存数位,ans 基本框架为 sol(m) - sol(n - 1) )
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 30;
int dig[maxn];
int dp[maxn][2][2];
int dfs(int pos, int six, int flag) {
if (pos < 0) return 1;
if (dp[pos][six][flag] != -1) return dp[pos][six][flag];
int res = 0;
for (int i = 0; i <= 9; i++) {
if (six && i == 2) continue;
if ( i == 4) continue;
if (flag && i > dig[pos]) continue;
res += dfs( pos - 1, i == 6, flag && i == dig[pos] );
}
return dp[pos][six][flag] = res;
}
int sol(int x) {
if (x < 0) return 0;
memset(dp, -1, sizeof(dp));
int cnt = 0;
while (x) {
dig[cnt++] = x % 10;
x /= 10;
}
return dfs(cnt - 1, 0, 1);
}
int main() {
int n, m;
while (~scanf("%d%d", &n, &m)) {
if (n == 0 && m == 0) break;
printf("%d\n", sol(m) - sol(n - 1));
}
}