HDU 2089 不要62 数位DP模板题
2024-08-26 11:08:34
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089
参考博客:https://www.cnblogs.com/HDUjackyan/p/9142156.html
说明,上面这篇博客已经可以很清楚地理解这道题目所表现得意思了。我这里是上述博客中的第一题。
这道题目呢我目前已经知道怎么做了,但是我还不能很好地做到用文字表述出来,所以大家可以试着看看我的代码,我也是通过看上面那篇博客的代码理解数位DP的思想的。
我在上面博客的代码中做了一些精简,省略了一个多余的状态参数,代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int a[20], dp[20][2];
/*
pos表示目前将要访问的位置
pre表示前一个值是不是6,因为这里涉及到62连数,所以我们在访问到后一位的时候要考虑前一位,这里pre就用于存储前一位
limit表示是不是在边界位置
*/
int dfs(int pos, int stat, bool limit) {
if (pos == -1) return 1;
if (!limit && dp[pos][stat] != -1) return dp[pos][stat];
int up = limit ? a[pos] : 9;
int tmp = 0;
for (int i = 0; i <= up; i ++) {
if (stat && i == 2) continue;
if (i == 4) continue;
tmp += dfs(pos-1, i==6, limit&&i==a[pos]);
}
if (!limit) dp[pos][stat] = tmp;
return tmp;
}
int solve(int x) {
int pos = 0;
while (x) {
a[pos++] = x % 10;
x /= 10;
}
return dfs(pos-1, 0, true);
}
int main() {
int l, r;
while ((cin >> l >> r) && l+r) {
memset(dp, -1, sizeof(dp));
cout << solve(r) - solve(l-1) << endl;
}
return 0;
}
其中,
- pos表示目前将要访问的位置
- pre表示前一个值是不是6,因为这里涉及到62连数,所以我们在访问到后一位的时候要考虑前一位,这里pre就用于存储前一位
- limit表示是不是在边界位置
学习链接:
最新文章
- 【淘淘】Quartz作业存储与管理
- 为什么C#中ref和out 关键字 ?
- 如何配置使用 Log4j
- UFS
- C ~ C语言字节对齐
- 教您如何检查oracle死锁,决解死锁
- 三角函数计算,Cordic 算法入门
- [5] Zygote
- Redis & Sentinel 安装脚本
- 【面试虐菜】—— Oracle中CHAR、VARCHAR的区别
- ui线程和后台线程异步
- [转]Centos 6.5 优化 一些基础优化和安全设置
- Cactus
- JMeter参数化实现
- ios知识点总结——UITableView的展开与收缩及横向Table
- RAID6三块硬盘离线导致的数据丢失恢复过程
- 6. Vulnerability scanners (漏洞扫描器 11个)
- switch变种玩法
- [加密算法]为什么说RSA难以被破解
- Linux中非正常关闭vi编辑器产生swp文件怎么删除