【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. Python socket粘包问题(最终解决办法)

    套接字: 就是将传输层以下的协议封装成子接口 对于应用程序来说只需调用套接字的接口,写出的程序自然是遵循tcp或udp协议的 实现第一个功能个:实现:通过客户端向服务端发送命令,调取windows下面 ...

  2. 九度oj 题目1368:二叉树中和为某一值的路径

    题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 输入: 每个测试案例包括n+1行: 第一行为2 ...

  3. POJ 2353 Ministry

    Ministry Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4220   Accepted: 1348   Specia ...

  4. HDU——1027Ignatius and the Princess II(next_permutation函数)

    Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ( ...

  5. HDU-2853 Assignment

    求二分最大匹配,但还要尽量接近原匹配... 解决方法:对于N个顶点的二分图,每条边同时乘上一个比N稍微大的数N',然后对于在原匹配的边就都+1. 经过这样处理,求得的答案Ans乘除N'即是原图的最大匹 ...

  6. Linux 下查找并删除文件命令

    以查找和删除mp3为扩展的文件为例: find . -name "*.mp3" |xargs rm -rf   (.表示在当前目录下执行)

  7. UVa12333 Revenge of Fibonacci

    高精度 trie 暴力预处理出前100000个fibonacci数,将每个数的前40位数字串插入到trie中,记录每个结点最早可以由哪个数字串到达. 然后依次回答询问即可. 存fibonacci数的数 ...

  8. 46深入理解C指针之---内存分析

    一.size_t:用于安全表示长度,所有平台和系统都会解析成自己对应的长度 1.定义:size_t类型表示C中任何对象所能表示的最大长度,是个无符号整数:常常定义在stdio.h或stdlib.h中 ...

  9. 反汇编->C++内联

    C/C++提供了内联函数机制 内联函数就是向编译器建议:编译这个函数的时候.直接把函数展开,而不是进行函数调用call.当然编译器并不接受这个建议.仍然把他当做普通函数进行编译 使用内联函数的优点:减 ...

  10. echarts 金字塔

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...