【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 ...
随机推荐
- Deep Android Malware Detection小结
题目:Deep Android Malware Detection 作者:Niall McLaughlin, Jesus Martinez del Rincon, BooJoong Kang 年份:2 ...
- 《机器学习实战》笔记——AdaBoost
笔记见备注 # _*_ coding:utf-8 _*_ from numpy import * # 简单数据集 def loadSimpData(): datMat = matrix([[1., 2 ...
- 【bzoj3210】花神的浇花集会 旋转坐标系
题目描述 在花老师的指导下,每周4都有一个集会活动,俗称“浇水”活动. 具体浇水活动详情请见BZOJ3153 但这不是重点 花神出了好多题,每道题都有两个参考系数:代码难度和算法难度 花神为了准备浇花 ...
- Educational Codeforces Round 11——C. Hard Process(YY)
C. Hard Process time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- P3919 (模板)可持久化数组 (主席树)
题目链接 Solution 主席树水题,连差分的部分都不需要用到. 直接用主席树的结构去存一下就好了. Code #include<bits/stdc++.h> #define mid ( ...
- [bzoj2302][HNOI2011]problem c 递推,dp
[HAOI2011]Problem c Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 949 Solved: 519[Submit][Status] ...
- angular中关于文件引入
var angular = require('angular'); module.exports = angular.module('app.mymodule2', []).controller('H ...
- hdu 5976 Detachment 脑洞题 猜结论
题目链接 题意 将\(x\)拆成\(a_1+a_2+...+\)的形式,且\(a_1\lt a_2\lt...\),使得\(a_1*a_2*...\)取到最大值 思路 大胆猜结论. 首先拆分的形式中肯 ...
- AC日记——狼抓兔子 bzoj 1001
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- 机器学习实战读书笔记(二)k-近邻算法
knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训 ...