求a~b中不包含49的数的个数. 0 < a、b < 2*10^9
思路:
数位dp, dp[i][1]表示第i+1位为4时第i位能构成的合法数字数量。dp[i][0]表示第i+1位不为4时第i位能构成的合法数字数量。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a, b;
int num[20], dp[20][2];
int dfs(int pos, bool state, bool limit)
{
if (pos < 0)
{
return 1;
}
if (!limit && dp[pos][state] > 0)
{
return dp[pos][state];
}
int result = 0;
int up = limit? num[pos] : 9;
for (int i = 0; i <= up; i++)
{
if (state && i == 9)
{
continue;
}
result += dfs(pos - 1, i == 4, limit && i == up);
}
if (!limit)
{
dp[pos][state] = result;
}
return result;
}
int solve(int x)
{
int pos = 0;
while (x > 0)
{
num[pos] = x % 10;
x /= 10;
pos++;
}
return dfs(pos - 1, false, true);
}
int main(int argc, const char * argv[])
{
cin >> a >> b;
memset(dp, 0, sizeof(dp));
cout << solve(b) - solve(a - 1);
return 0;
}