[HDU4734] 不要62(数位dp入门)
题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个。
思路:数位dp
就是数位上不能有4也不能有连续的62,没有4的话在枚举的时候判断一下,不枚举4就可以保证状态合法了,所以这个约束没有记忆化的必要,而对于62的话,涉及到两位,当前一位是6或者不是6这两种不同情况我计数是不相同的,所以要用状态来记录不同的方案数。
dp[pos][sta]表示当前第pos位,前一位是否是6的状态,这里sta只需要去0和1两种状态就可以了,不是6的情况可视为同种,不会影响计数。
Code

#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[20]; int dp[20][2]; int dfs(int pos, int pre, int sta, int limit){ if (pos==0) return 1; if (!limit&&dp[pos][sta]!=-1) return dp[pos][sta]; int up = limit?a[pos]:9; int tmp = 0; for (int i = 0; i <= up; i++) { if (pre==6&&i==2) continue; if (i==4) continue; tmp += dfs(pos-1, i, i==6, limit&&i==a[pos]); } if(!limit) dp[pos][sta] = tmp; return tmp; } int solve(int x) { int pos = 1; while (x){ a[pos++] = x%10; x /= 10; } return dfs(pos-1, -1, 0, 1); } int main() { int l, r; memset(dp, -1, sizeof(dp)); while (~scanf("%d%d", &l, &r)&&l+r) printf("%d\n", solve(r)-solve(l-1)); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?