HDU 2089
数字中不能出现’4’和’62’,问在某个区间中这样的数字有多少个。
学下数位DP,抄了一个大哥的代码。
dp[i][j]表示当前讨论的是数字十进制表示的第i位,并且i+1位为j的总答案数。
网上还有一种表示方法是dp[i][j],j为0、1,表示前一位是否为6.
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 10;
int dp[MAXN + 4][MAXN+ 4];
int digit[MAXN];
int dfs(int pos, int pre, bool limit)
{
if(pos <= 0) return 1;
if(!limit && dp[pos][pre] != -1) return dp[pos][pre];
int up = limit ? digit[pos] : 9;
int res = 0;
for(int i = 0 ; i <= up ; i++) {
if(i == 4 || (pre == 6 && i == 2)) continue;
res += dfs(pos - 1, i, limit && i == up);
}
return limit ? res : dp[pos][pre] = res;
}
int cal(int n)
{
int cnt = 0;
while(n) {
digit[++cnt] = n % 10;
n /= 10;
}
return dfs(cnt, 0, 1);
}
int main()
{
memset(dp, -1, sizeof dp);
int n, m;
while(scanf("%d%d", &n, &m) != EOF && n + m) {
int ans = cal(m) - cal(n - 1);
printf("%d\n", ans);
}
return 0;
}