博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈数位dp
阅读量:4647 次
发布时间:2019-06-09

本文共 1216 字,大约阅读时间需要 4 分钟。

此博客收集了其他队员中写的比较完整的一篇博客,对于其中的东西解释已经很完善

不再做过的阐述,链接在此     

(链接的博主渴望大家的赞)

我只对上述博客的最后一个AC代码做出解释形阐述

只是我的个人理解,对一些难理解的地方做出注释以及个人的微不足道的理解

此代码的dp储存的是第i位的上一位是六(dp[i][1])和不是6(dp[i][0])的情况

#include
#include
int n, m;int dp[20][10], digit[8]; int dfs(int pos, int pre, int limit){ if(pos == 0)// 递归边界,已经枚举结束,则1个数满足条件 return 1; if(!limit && dp[pos][pre] != -1) // 已经搜索过的不再搜索,直接使用之前的计算结果 return dp[pos][pre]; int ans = 0; int maxd = limit ? digit[pos] : 9; for(int i = 0; i <= maxd; i ++) { if(i == 4 || (i == 2 && pre == 6)) // 枚举数字,如果数字不同则枚举0-9 continue; ans += dfs(pos - 1, i, limit && i == digit[pos]); } if(!limit) //当没有上限的时候才需要保存此值 dp[pos][pre] = ans; return ans;} int count(int n){ int len = 0; while(n) { digit[++ len] = n % 10; n /= 10; } return dfs(len, 0, 1);//刚开始递归的时是从最高为开始递归的,所以上限为true,而由于最高为是从0开始dfs的,所以if6为false} int main(){ memset(dp, -1, sizeof(dp)); while(scanf("%d%d", &n, &m)!=EOF) { if(n == 0 && m == 0) break; printf("%d\n", count(m) - count(n - 1)); } return 0;}

 

转载于:https://www.cnblogs.com/tombraider-shadow/p/10609510.html

你可能感兴趣的文章
css 定位及遮罩层小技巧
查看>>
项目中非常有用并且常见的ES6语法
查看>>
[2017.02.23] Java8 函数式编程
查看>>
Knowledge Point 20180305 数据在计算机中的表示
查看>>
谈谈对web标准的理解
查看>>
58前端内推笔试2017(含答案)
查看>>
sprintf 和strcpy 的差别
查看>>
MPEG4与.mp4
查看>>
实验5
查看>>
git 下载 安装
查看>>
录制终端信息并回放
查看>>
JS中window.event事件使用详解
查看>>
ES6深入学习记录(一)class方法相关
查看>>
《BI项目笔记》用Excel2013连接和浏览OLAP多维数据集
查看>>
C语言对mysql数据库的操作
查看>>
SQL Server 数据库备份
查看>>
INNO SETUP 获得命令行参数
查看>>
Charles抓取https请求
查看>>
LAMP环境搭建
查看>>
C语言的变量的内存分配
查看>>