题目链接: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表示是不是在边界位置

学习链接:

最新文章

  1. 【淘淘】Quartz作业存储与管理
  2. 为什么C#中ref和out 关键字 ?
  3. 如何配置使用 Log4j
  4. UFS
  5. C ~ C语言字节对齐
  6. 教您如何检查oracle死锁,决解死锁
  7. 三角函数计算,Cordic 算法入门
  8. [5] Zygote
  9. Redis & Sentinel 安装脚本
  10. 【面试虐菜】—— Oracle中CHAR、VARCHAR的区别
  11. ui线程和后台线程异步
  12. [转]Centos 6.5 优化 一些基础优化和安全设置
  13. Cactus
  14. JMeter参数化实现
  15. ios知识点总结——UITableView的展开与收缩及横向Table
  16. RAID6三块硬盘离线导致的数据丢失恢复过程
  17. 6. Vulnerability scanners (漏洞扫描器 11个)
  18. switch变种玩法
  19. [加密算法]为什么说RSA难以被破解
  20. Linux中非正常关闭vi编辑器产生swp文件怎么删除

热门文章

  1. Bootstrap是什么意思?
  2. webuploader如何实现分片+断点续传
  3. 「ZJOI2019」线段树
  4. MySQL七种join理论
  5. mac环境使用python处理protobuf
  6. IDEA控制台乱码终极解决方案
  7. (二)SQL学习之数据定义类SQL
  8. Java设计模式之二工厂模式
  9. 第07组 团队Git现场编程实战
  10. tx1 gpio