【HDOJ 2089】不要62
第一个数位dp的题 做的老困难了。。。只是好歹是做出来了 迈出了第一步。。
对大牛来说这样的题都是小case
ps:新上一个记忆化方法 一些绕弯的题里用dfs好想些
代码例如以下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[8][3];
/*
dp[i][0]无不吉利数字
dp[i][1]无不吉利数字且高位为2
dp[i][2】有不吉利数字
*/
void Init()
{
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
int i;
for(i = 1; i <= 8; ++i)
{
dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; //在最高位加上除了4之外的9个数字,可是可能在2之前加了6
dp[i][1]=dp[i-1][0]; //在原先不含不吉利数字的最高位加2
dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1]; //在已经有不吉利数字最高位加随意数字。或者在无吉利数字前加4,或者在2前面加4
}
}
int Solve(int n)
{
int ls[9],len = 0,i,ans,tmp = n,flag = false;
while(n)
{
ls[++len] = n%10;
n /= 10;
}
ans = ls[len+1] = 0;
for(i = len; i; --i)
{
ans += dp[i-1][2]*ls[i];
if(flag) //高位已出现4或62 后面随意加
ans += dp[i-1][0]*ls[i];
if(!flag && ls[i] > 4) //高位有出现4的可能
ans += dp[i-1][0];
if(!flag && ls[i+1] == 6 && ls[i] > 2)//高位有出现62的可能
ans += dp[i][1];
if(!flag && ls[i] > 6)
ans += dp[i-1][1];
if(ls[i] == 4 || (ls[i+1] == 6 && ls[i] == 2)) //出现4或62
flag = 1;
}
return tmp - ans;
}
int main()
{
int n,m;
Init();
while(~scanf("%d %d",&n,&m) && n && m)
{
printf("%d\n",Solve(m)-Solve(n-1));//[m,n]区间
}
return 0;
}
//记忆化
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[8][3],digit[8];
/*
hav =
2 不含不吉利数字
1 不含不吉利数字 最高位6
0 含不吉利数字
high:前面是否出现高位(即当前位置可不能够随便填
*/
int dfs(int pos,int hav,bool high)
{
if(pos == -1) return hav == 0;
if(!high && ~dp[pos][hav]) return dp[pos][hav];
int en = high? digit[pos]: 9;
int i,ans = 0,nhav;
for(i = 0; i <= en; ++i)
{
nhav = hav;
if((hav == 1 && i == 2) || i == 4) nhav = 0;
else if(hav == 2 && i == 6) nhav = 1;
else if(hav == 1 && i != 6) nhav = 2;
ans += dfs(pos-1,nhav,high && i == en);
}
if(!high) dp[pos][hav] = ans;
return ans;
}
int Solve(int x)
{
memset(dp,-1,sizeof(dp));
int len = 0,tmp = x;
while(x)
{
digit[len++] = x%10;
x /= 10;
}
return tmp - dfs(len-1,2,1);
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m) && n)
{
printf("%d\n",Solve(m) - Solve(n-1));
}
return 0;
}
【HDOJ 2089】不要62的更多相关文章
- HDOJ 2089 不要62
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDOJ 2089 不要62(打表)
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...
- Hdu 2089 不要62 (数位dp入门题目)
题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...
- HDOJ题目2089 不要62(数位DP)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu 2089 不要62(初学数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给定 m,.n; 求车牌号 m~n之间 有多少数字 不含 4或62 ,8652是可以的 . ...
- 数位DP HDU - 2089 不要62
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2089 - 不要62 - [数位DP][入门题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- HDU 2089 不要62(数位dp模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...
- [hdu 2089] 不要62 数位dp|dfs 入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...
随机推荐
- Android SDK Manager 报错:Connection to https://dl-ssl.google.com refused
Connection to https://dl-ssl.google.com refused. OR Failed to fectch URl https://dl-ssl.google.com/a ...
- [python篇][1]configparser 问题汇总
https://wiki.python.org/moin/ConfigParserExamples 1 错误一 nicodeEncodeError: 'ascii' codec can't encod ...
- 理解 PHP output buffer
在需要使用输出缓存区的时候,一般会在代码中加上ob_start()这个函数. 这是因为php.ini中output_buffering设置为off时,则缓存区处于关闭状态,需要用ob_start()打 ...
- 5款工具助你写出更好的Java代码
1.FindBugs 顾名思义,FindBugs是一款帮助开发者发现bug的工具,它是一个开源项目,遵循GNU公共许可协议,运行的是Java字节码而不是源码. 它是一款静态分析工具,它检查类或者JAR ...
- 【转】Unicode utf8等编码类型的原理
原文地址http://www.cnblogs.com/daxiong2014/p/4768681.html Unicode utf8等编码类型的原理 1.ASCII码 我们知道,在计算机内部,所有的 ...
- iOS学习笔记36-Masonry自动布局
一.Masonry介绍 之前我们在屏幕适配的章节中学习过AutoLayout的使用,但那都是在可视化界面上进行添加约束完成的,我们很多时候都需要在代码中使用AutoLayout约束,苹果也为我们提供了 ...
- iOS学习笔记33-UICollectionView入门
一.UICollectionView介绍 UICollectionView和UICollectionViewController类是iOS6新引进的API,用于展示集合视图,布局更加灵活,可实现多列布 ...
- BZOJ4598 [Sdoi2016]模式字符串 【点分治 + hash】
题目 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多少对结点< ...
- 模拟tap事件和longTap事件
移动端模拟tap和longTap事件,基本原理就是在touchstart和touchend事件中,计算触摸的位移和时间差,位移在一定范围内(轻微滑动),时间小于150ms为tap事件,时间大于300m ...
- Java 学习(2):java 基础概念
Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 基础语法: 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.以 ...