找出1 - N中所有包含49字串的数字个数
思路:普通的数位DP,先找出布包含的,然后总数减去不包含的即可
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 25; int t; char num[N]; ll dp[N][10], ans; int main() { scanf("%d", &t); while (t--) { scanf("%s", num); int n = strlen(num); sscanf(num, "%I64d", &ans); ans++; int pre = 0, flag = 0; memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; i++) { for (int j = 0; j < 10; j++) { for (int k = 0; k < 10; k++) { if (j == 9 && k == 4) continue; dp[i + 1][j] += dp[i][k]; } } if (flag) continue; for (int j = 0; j < num[i] - '0'; j++) { if (j == 9 && pre == 4) continue; dp[i + 1][j]++; } if (pre == 4 && num[i] - '0' == 9) flag = 1; pre = num[i] - '0'; } for (int i = 0; i < 10; i++) ans -= dp[n][i]; ans -= !flag; printf("%I64d\n", ans); } return 0; }