hdu_2089 不要62
数位动态规划
数位动态规划是求解一个大区间[L, R]中间满足条件Q的所有数字的个数(或者和,或其他)的一种方法。它通过分析每一位上的数字,一般用 dp[len][digit][...] 来表示状态“len位长的数字,最高位数字为digit所具有的xx特性”,利用记忆化搜索保存中间结果,从而加快求解速度。
通过求 f(n) 从0到n中满足条件Q的数字的个数,则所求的结果为 f(R) - f(L-1).
大多数数位dp都可以用一个DFS函数来进行记忆化搜索:
//len数字的位数,digit最高位的值,end_flag 表示digit是否是第len位(从低位向高位数,个位为第1位) 的范围边界
int Dfs(int len, int digit, bool end_flag){
//超出边界
if (len <= 0 || digit > 9 || digit < 0)
return 0;
//记忆化搜索,如果之前已经求出来了,则返回。注意这里要求 end_flag为false
if (!end_flag && dp[len][digit] != -1)
return dp[len][digit]; // 最简单情况看数字是否满足要求
if (len == 1)
return dp[len][digit] = xxx; //如果当前位是边界数字N对应位的最大值,则下一位的范围只能从0到边界数字N的下一位的最大值。否则为0 到 9
int end = end_flag ? bits[len - 2] : 9; int ans = 0;
for (int i = 0; i <= end; i++){
ans += Dfs(len - 1, i, end_flag && (i==end));
}
if (!end_flag) //digit不是第len位的最高范围,则可以将结果缓存
dp[len][digit] = ans;
return ans;
}
题目大意
给定一个区间[L, R],求区间内满足条件“数位上不含有4,且不含有62(62必须连续)”的数字的个数。
分析
直接套用模板
实现
#include<iostream>
#include<stdio.h>
using namespace std;
int dp[9][10];
int bits[8]; //用dfs进行记忆化搜索, dp[len][digit] 表示 len位数字,最高位为digit满足条件的个数. 这里对数字范围没有限制!
//搜索的时候,若要进行记忆化,需要 dp[len][digit]的结果对数字范围没有限制,因此需要判断 end_flag来决定是否进行记忆。 //len数字的位数,digit最高位的值,end_flag 表示digit是否是第len位(从低位向高位数,个位为第1位) 的范围边界
int Dfs(int len, int digit, bool end_flag){
//超出边界
if (len <= 0 || digit > 9 || digit < 0)
return 0;
//记忆化搜索,如果之前已经求出来了,则返回。注意这里要求 end_flag为false
if (!end_flag && dp[len][digit] != -1)
return dp[len][digit]; // 最简单情况看数字是否满足要求
if (len == 1)
return dp[len][digit] = (digit != 4);
if (digit == 4)
return dp[len][digit] = 0; //如果当前位是边界数字N对应位的最大值,则下一位的范围只能从0到边界数字N的下一位的最大值。否则为0 到 9
int end = end_flag ? bits[len - 2] : 9; int ans = 0;
for (int i = 0; i <= end; i++){
if (!(digit == 6 && i == 2)) //除去 62连续的情况
ans += Dfs(len - 1, i, end_flag && (i==end));
}
if (!end_flag) //digit不是第len位的最高范围,则可以将结果缓存
dp[len][digit] = ans;
return ans;
} //将数字n的各个位上的范围求出来,保存到bits数组中,返回数字n的长度
int Init(int n){
memset(bits, 0, sizeof(bits));
int k = 0;
while (n){
bits[k++] = n % 10;
n /= 10;
}
return k;
} int Solve(int n){
int len = Init(n);
//数字长度为len,则为了避免首位遍历从0到bits[len-1],给数字增加一个前导0。
//len + 1位,首位为0,且0是最高位的边界
int ans = Dfs(len + 1, 0, true);
return ans;
}
int main(){
int m, n;
memset(dp, -1, sizeof(dp));
while (scanf("%d %d", &m, &n)){
if (m == 0 && n == 0)
break;
int ret1 = Solve(m-1);
int ret2 = Solve(n);
int ret = ret2 - ret1;
printf("%d\n", ret);
}
return 0;
}
hdu_2089 不要62的更多相关文章
- VS2015编译boost1.62
VS2015编译boost1.62 Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有 ...
- P87LPC760/61/62/64/67/68/69/78/79芯片解密单片机破解价格
NXP恩智浦P87LPC760/61/62/64/67/68/69/78/79芯片解密单片机破解 NXP LPC700系列单片机解密型号: P87LPC759.P87LPC760.P87LPC761. ...
- HDU2089 不要62[数位DP]
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Connection broken for id 62, my id = 70, error =
启动费zokeeper失败,报错如下:Connection broken for id 62, my id = 70, error = 原因是因为zoo.cfg中server.id不正确. serve ...
- base64/62 加解密的实现。
base64/62加解密代码下载地址: http://files.cnblogs.com/files/Kingfans/base64(62)加解密.zip base64: base62:
- /usr/include/sys/types.h:62: error: conflicting types for ‘dev_t’
/usr/include/sys/types.h:62: error: conflicting types for ‘dev_t’/usr/include/linux/types.h:13: erro ...
- [HDU2089]不要62
[HDU2089]不要62 试题描述 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就 ...
- NYOJ题目62笨小熊
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAr4AAAK1CAIAAAChInrhAAAgAElEQVR4nO3dO3LjutaG4X8Szj0Qxx
- 62个Android Studio小技巧合集
1书签(Bookmarks) 描述:这是一个很有用的功能,让你可以在某处做个标记(书签),方便后面再跳转到此处. 调用:Menu → Navigate → Bookmarks 快捷键: 添加/移除书签 ...
随机推荐
- 算法大全(c,c++)
http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):in ...
- Java Cryptography Extension (JCE): 放开Java加密算法密钥最大长度16的限制
1. 在官网下载JCE: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads- ...
- django下的ckeditor 5.0 文本编辑器上传功能。
完整的后台界面怎么可以没有文本编辑器,但是django的admin界面很疑惑,没有自带文本编辑器,好在网上有不少成型的库可以用 我用的是ckeditor编辑器,安装和配置我引用别人的博客 这篇博客配置 ...
- nl2br
PHP中 在字符串所有新行之前插入 HTML 换行标记 说明 string nl2br ( string $string [, bool $is_xhtml = true ] ) 在字符串 str ...
- oracle数据库导入导出dmp文件oracle命令
在控制台下导入imp scott/密码@orcl file=文件路径 full=Y 导出 整个数据库TEST 用户名system 密码1234 exp system/1234@TEST file=文 ...
- js写个日历
其实我是一个对时间和日期不怎么感兴趣的人,小学的时候感觉时间或者日期那块就让我很晕,因为有时候是100进制有时候是60进制,搞的我对日历一直很不感兴趣,最近不知道为什么想写一个日历了,可想而知,这个玩 ...
- python处理字符串时出现的错误'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决方法
解决办法,在该python文件的前面加上如下几句,问题得到解决. import sys default_encoding = 'utf-8' if sys.getdefaultencoding() ! ...
- winform继承窗体,无法修改父窗体控件问题处理笔记
问题描述: 一个窗体集成父窗体,发现无法直接修改父窗体的控件,比如修改大小等,父窗体控件已经设置为public,如果做成一个dll被引用无此问题 特征: 不禁使父窗体控件,就算新加一个控件也会这样:鼠 ...
- ubuntu中rar与unrar用法详解
本文转载:http://helloklzs.iteye.com/blog/1139993 安装: sudo apt-get install rar 这样就可以安装了 删除是以下语句 sudo apt- ...
- jQuery的Deferred
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...