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 ", sol(m) - sol(n - 1)); } }