hdu2089 不要62--经典数位DP
一道十分经典的数位DP的题目。
dp[i][j]表示最高位是数字i,连同最高位在内共有j位。注意边界的初始化。
接下来就是区间划分,特殊情况处理.....对了,如果不知道自己的方法是否正确,可以写一个测试函数:
bool check(int n){ //判断n是否符合条件 int a[20]; int c=0; while(n>0){ a[c++]=n%10; n/=10; } for(int i=0;i<c;++i) if(a[i]==4) return false; for(int i=0;i<c-1;++i){ if(a[i]*10+a[i+1]==26) return false; } return true; } inline int solve(int n){ //可以求得0~n之间有多少符合条件的数 int ans=0; for(int i=0;i<=n;++i) if(check(i)) ++ans; return ans; }
AC代码:
#include<cstdio> #include<cstring> #include<cmath> const int maxn=20; int dp[10][maxn]; void deal(){ memset(dp,0,sizeof(dp)); //初始化边界 for(int i=0;i<10;++i){ if(i==4) continue; else dp[i][1]=1; } for(int i=2;i<10;++i){ //length for(int j=0;j<10;++j){ if(j==4) continue; for(int k=0;k<10;++k){ dp[j][i]+=dp[k][i-1]; } } dp[6][i]-=dp[2][i-1]; } } inline int solve(int pre,int n,int len){ if(pre==62||pre%10==4||pre/10==4) return 0; if(len==1){ int ans=0; for(int i=0;i<=n;++i) if(i==4) continue; else ++ans; if(pre%10==6&&n>=2) --ans; return ans; } int ans=0; int m=(int)pow(10,len-1); int up=n/m; for(int i=0;i<up;++i){ ans+=dp[i][len]; } if(pre%10==6&&up>2) ans-=dp[2][len]; return ans+solve(pre%10*10+up,n%m,len-1); } inline int getlen(int n){ if(n==0) return 1; int c=0; while(n>0){ n/=10; ++c; } return c; } int main(){ deal(); int l,r; while(scanf("%d%d",&l,&r)!=EOF&&l&&r){ int a=solve(0,r,getlen(r)); int b=solve(0,l-1,getlen(l-1)); //printf("%d-%d=%d\n",a,b,a-b); printf("%d\n",a-b); } return 0; }
如有不当之处欢迎指出!
hdu2089 不要62--经典数位DP的更多相关文章
- ☆ [HDU2089] 不要62「数位DP」
类型:数位DP 传送门:>Here< 题意:问区间$[n,m]$的数字中,不含4以及62的数字总数 解题思路 数位DP入门题 先考虑一般的暴力做法,整个区间扫一遍,判断每个数是否合法并累计 ...
- HDU2089 ------不要62(数位dp)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU2089 不要62 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目大意:求区间 \([l,r]\) 范围内不包含数字"4"且不包含连续的数 ...
- hdu2089不要62(数位dp)
#include <stdio.h> #include <string.h> ][]; ]; /* dp[i][0] 不含62,4 dp[i][1] 2开头 dp[i][2] ...
- HDU 2089 不要62(数位dp入门)
题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 题解:这是数位DP的入门题了,首先要理解数DP的原理,DP[i][j]:代表第i位的第j值,举个栗子:如4715 数位数是从右向 ...
- HDU 2089 不要62 【数位dp】
<题目链接> 不要62 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照 ...
- HDU 2089 不要62(数位dp模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...
- HDU 2089 不要62【数位DP入门题】
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 【ACM】不要62 (数位DP)
题目:http://acm.acmcoder.com/showproblem.php?pid=2089 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新 ...
随机推荐
- python_怎么格式化字符串?
案例: 如何对下面字典的key左对齐 {'dhqbl': 30, 'psfgj': 40, 'ontpqsb': 90, 'mrean': 110, 'klespjtr': 60, 'lprnkqhb ...
- junit测试延伸--私有方法测试
关于junit测试的延伸,这里有类概念级别的测试,继承类的测试,接口的测试,抽象类的测试,关于这些类级别的测试,这里我就不做多的赘述了. 关于上面的几个测试就是说,我们不应该单纯的去测试类中的一些方法 ...
- MySQL查看和修改表的存储引擎
1 查看系统支持的存储引擎 show engines; 2 查看表使用的存储引擎 两种方法: a.show table status from db_name where name='table_na ...
- 异常org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 11; 注释中不允许出现字符串 "--"。的原因
是由于编码格式不统一导致的. 把ecplise的workpace的编码改成utf-8
- tp5命令行基础
命令行工具需要在命令行下面执行,请先确保你的php.exe已经加入了系统环境变量Path. 要执行命令,首先进入命令行,并切换当前目录到应用的根目录(也就是think文件所在目录)下面,执行: php ...
- php加入环境变量
一.配置变量 右击计算机-属性-高级系统设置-环境变量-系统变量-双击path,编辑,将php的文件夹路径添加到后面,我是:D:\wamp64\bin\php\php5.6.25 二.测试 当没有加入 ...
- matlab文件读写处理实例(三)——读取文件特定行
(1) 读取文件特定行 CODE: ; ; if nline==line fprintf(fidout,'%s\n',tline); data ...
- MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片
MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片 本文主要介绍了通过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的情况下,通过HLS协议 ...
- 通俗化理解Spring3 IoC的原理和主要组件(spring系列知识二总结)
♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转(Io ...
- java web 获取客户端操作系统信息
package com.java.basic.pattern; import java.util.regex.Matcher; import java.util.regex.Pattern; /** ...