【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的更多相关文章

  1. HDOJ 2089 不要62

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. HDOJ 2089 不要62(打表)

    Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...

  3. Hdu 2089 不要62 (数位dp入门题目)

    题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...

  4. HDOJ题目2089 不要62(数位DP)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. hdu 2089 不要62(初学数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给定 m,.n; 求车牌号 m~n之间 有多少数字 不含 4或62     ,8652是可以的 . ...

  6. 数位DP HDU - 2089 不要62

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  8. HDU 2089 不要62(数位dp模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...

  9. [hdu 2089] 不要62 数位dp|dfs 入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...

随机推荐

  1. day04_08 while循环02

    练习题: 1.输出九九乘法表 2.使用#号输出一个长方形,用户可以指定宽和高,如果长为3,高为4,则输出一个 横着有3个#号,竖着有4个#号 的长方形. 3.如何输出一个如下的直角三角形,用户指定输出 ...

  2. pip安装及使用

    1.pip下载安装 1.1 pip下载 # wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5= ...

  3. Leetcode 464.我能赢吗

    我能赢吗 在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到 100 的玩家,即为胜者. 如果我们将游戏规则改为 ...

  4. 聊聊、Spring 第一篇

    Spring 大家都不陌生,企业应用中很流行的一个平台.从最开始的 Servlet 控制所有,到 MVC 模式的出现.从 SSH (Struts.Spring.Hibernate) 所谓的三剑客 到 ...

  5. mysql使用日常备忘

    批量插入数据时,如果主键是有业务意义的,并非自自增张,那么有可能在插入的数据中有与已存在的键值重复的,可以用如下方式来插入: INSERT IGNORE 当要插入一个数据时,插入的字段值中主键字段或唯 ...

  6. 【转】C#中的implicit 和 explicit

    The implicit and explicit keywords in C# are used when declaring conversion operators. Let's say tha ...

  7. iOS--------手势识别的详细使用:拖动、缩放、旋转、点击、手势依赖、自定义手势

    1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性. iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了 ...

  8. BZOJ 4821 [Sdoi2017]相关分析 ——线段树

    打开题面,看到许多$\sum$ woc,好神啊,SDOI好强啊 然后展开之后,woc,SDOI好弱啊,怎么T3出个线段树裸题啊. 最后写代码的时候,woc,SDOI怎么出个这么码农的题啊,怎么调啊. ...

  9. 【bzoj1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 SA+二分

    Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个“模式”. John的牛奶按质 ...

  10. Quotes in shell(bash, csh)

    There are three kinds of quote: single quote('), double quote("), backslash(\), how shell expla ...