数位dp。
给一个N,问你从[1,N]中包含49的数的个数。
主要有两点。
solve(x)求的是[0,x]中不包含49的个数(一检测到“49”就continue了)- 这题要用
__int64,这玩意linux还用不了,所以定义一个typedef是好习惯,方便改。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <queue>
using namespace std; // 数位dp模板
typedef __int64 ll; // 视运行环境而定
ll N;
int T;
int num[30];
ll dp[30][2];
ll dfs(int pos, int status, bool limit)
{
//printf("dfs(%d, %d, %s)\n", pos, status, limit ? "true" : "false");
if (pos == -1) return 1;
if ((!limit) && dp[pos][status] != -1) return dp[pos][status];
ll cnt = 0;
int up = (limit ? num[pos] : 9);
for (int i = 0; i <= up; i++)
{
if ((status == 1) && i == 9) continue;
cnt += dfs(pos - 1, i == 4 ? 1 : 0, limit && (i == up));
}
if (!limit) dp[pos][status] = cnt;
return cnt;
}
ll solve(ll x)
{
int pos = 0;
for (; x;)
{
num[pos++] = x % 10;
x /= 10;
}
return dfs(pos - 1, 0, true);
}
int main()
{
scanf("%d", &T);
memset(dp, -1, sizeof dp); //
for (; T--;)
{
scanf("%I64d", &N);
printf("%I64d\n", N + 1 - solve(N)); // 因为solve把0也算进去了
}
return 0;
}

本文介绍了一种使用数位动态规划(数位DP)解决特定问题的方法:给定一个整数N,求解从1到N中包含特定数字序列“49”的数的数量。通过自定义__int64类型确保跨平台兼容性,实现了一个递归的数位DP算法,并提供了完整的C++代码示例。
484

被折叠的 条评论
为什么被折叠?



