HDU 2089 不要62 (数位DP)

本文介绍了使用数位DP技术解决区间[L,R]内含有特定数字(如4或相邻的62)的计数问题。通过改变状态转移,实现了独立编写并成功解决该类型问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

求区间[L,R]内含有4或者含有相邻62的数的个数。

思路

和上一道题目 HDU 3555一样,只需要改变一下状态转移即可。 第一道自己独立写出来的数位DP,而且还1Y~~^_^

代码

  [cpp] #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <set> #include <stack> #include <queue> #define MID(x,y) ((x+y)/2) #define MEM(a,b) memset(a,b,sizeof(a)) #define REP(i, begin, m) for (int i = begin; i < begin+m; i ++) using namespace std; typedef long long LL; typedef vector <int> VI; typedef set <int> SETI; typedef queue <int> QI; typedef stack <int> SI; const int oo = 0x7fffffff; const int maxn = 10; int dp[maxn][maxn][2]; vector <int> num; int dfs(int pos, int pre, bool flag, bool limit){ if (pos == -1) return 1-flag; if (!limit && ~dp[pos][pre][flag]) return dp[pos][pre][flag]; int end = limit?num[pos]:9; int res = 0; for (int i = 0; i <= end; i ++){ res += dfs(pos-1, i, i == 4 || (i == 2 && pre == 6) || flag, limit && (i == end)); } if (!limit) dp[pos][pre][flag] = res; return res; } int cal(int x){ num.clear(); while(x){ num.push_back(x % 10); x /= 10; } MEM(dp, -1); return dfs(num.size()-1, 0, 0, 1); } int main(){ //freopen("test.in", "r", stdin); //freopen("test.out", "w", stdout); int n, m; while(scanf("%d %d", &n, &m), n+m){ printf("%d\n", cal(m) - cal(n-1)); } return 0; } [/cpp]

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114095.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值