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_百文买百鸡问题
百文买百鸡问题 -- 不定方程 -- 公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡,如何买? -- 列出方程式 x + y + z = 100 5x + 3y + z/3 ...
- 使用EndNote在Word中插入参考文献的格式设置
endnote其实自带了很多参考文献格式的样式,如下图,但往往跟我们要使用的会有所出入,本文主要介绍的就是设置自定义endnote参考文献格式,以endnote X6和word2003为例,其它版本以 ...
- nodejs爬虫笔记(四)---利用nightmare解决加载更多问题
目标: 解决页面加载更多问题.笔记三中,我们只爬取到网页的部分信息,而点击加载更多后的页面内容是没有提取到的.开始我的想法是找到加载更多的数据接口(可参照:http://www.jianshu.com ...
- Java自学能学会吗?最新Java高级学习路线
就好像一千个人心中有一千个哈利波特一样,这个答案不绝对也不唯一,Java好学但自学的确阻力有些大,作为一门技术语言,它所蕴含的智慧绝对不是靠几本XX入门,XX框架之类的书所能概括,自学Java你要做好 ...
- openstack一键安装脚本(转载)
#!/bin/sh # openstack pike 单机 一键安装 # 环境 centos 7.4.1708 x86_64 # 更多内容 http://dwz.cn/openstack # Myde ...
- JavaBean,List,Map,json格式之间转化方式
public class TestBean { private String id; private String name; private String password; public Stri ...
- bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]
4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...
- 自用最小生成树模板(基于Kruskal)
200ms的板子,我尽力了,以我自己的能力没法再快了... 基于Kruskal的做法,跑了200ms,以我自己的能力没办法再快了,不过翻了几页评测列表发现我是最快的...我觉得应该会有更快的方法.想法 ...
- POJ3155 Hard Life [最大密度子图]
题意:最大密度子图 #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- HDU 4333 [SAM WRONG!!!]
题意:给一个数字,每一次把它的最后一位拿到最前面,一直那样下去,分别求形成的数字小于,等于和大于原来数的个数. SAM上就是走n步 相等好好做啊,但是大于小于不好做啊,用类似弦论的思想也不能处理出怎样 ...