HDU 2089 不要62:数位dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089
题意:
问你在区间[n,m]中,有多少个数字不含"4"且不含"62"。
题解:
表示状态:
dp[i][j] = numbers
数字有i位,开头为数字j,合法的数字个数。
如何转移:
dp[i][j] = ∑ dp[i-1][k] (j!=4,6 && k!=4)
dp[i][6] = ∑ dp[i-1][k] (k!=2,4)
dp[i][4] = 0
边界条件:
dp[0][0] = 1
找出答案:
题目中询问的是区间,所以答案可以用差分形式表示:
ans = cal_ans(m+1) - cal_ans(n)
cal_ans(i)表示小于i的合法数字个数。
比如我要求小于32768的合法数字个数:
ans += 0xxxx, 1xxxx, 2xxxx的个数
ans += 30xxx, 31xxx的个数
ans += 320xx, 321xx, 322xx, 323xx, 324xx, 325xx, 326xx的个数
ans += 3270x, 3271x, 3272x, 3273x, 3274x, 3275x的个数
ans += 32760, 32761, 32762, 32763, 32764, 32765, 32766, 32767的个数(均为1)
所以依次枚举i(从len到1),意思是i+1位之前的数字都已确定,该枚举第i位了。
枚举第i位的数字为j。ans+=dp[i][j]的条件是前一位和当前位不能构成"62",即:d[i+1]!=6 || j!=2
并且,一旦(d[i]==4 || (d[i+1]==6 && d[i]==2)),就应退出循环,因为之后枚举的数字一定都是不合法的。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_L 10
#define MAX_D 15 using namespace std; int n,m;
int d[MAX_L];
int dp[MAX_L][MAX_D]; void cal_dp()
{
memset(dp,,sizeof(dp));
dp[][]=;
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
for(int k=;k<=;k++)
{
if(j!= && (j!= || k!=))
{
dp[i][j]+=dp[i-][k];
}
}
}
}
} int cal_ans(int x)
{
int len=;
int ans=;
while(x)
{
d[++len]=x%;
x/=;
}
d[len+]=;
for(int i=len;i>;i--)
{
for(int j=;j<d[i];j++)
{
if(d[i+]!= || j!=) ans+=dp[i][j];
}
if(d[i]== || (d[i+]== && d[i]==)) break;
}
return ans;
} int main()
{
cal_dp();
while(cin>>n>>m)
{
if(n== && m==) break;
cout<<cal_ans(m+)-cal_ans(n)<<endl;
}
}
HDU 2089 不要62:数位dp的更多相关文章
- Hdu 2089 不要62 (数位dp入门题目)
题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...
- 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|dfs 入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...
- HDU 2089 不要62 数位DP模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...
- HDU 2089 不要62(数位DP·记忆化搜索)
题意 中文 最基础的数位DP 这题好像也能够直接暴力来做 令dp[i][j]表示以 j 开头的 i 位数有多少个满足条件 那么非常easy有状态转移方程 dp[i][j] = sum{ dp[ ...
- hdu 2089 不要62 数位dp
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2089 不要62 (数位dp基础题)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2089不要62 (数位dp)
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...
- hud 2089 不要62 (数位dp)
#include<stdio.h> #include<string.h> #include<math.h> #define max 10 ]; int number ...
- HDOJ题目2089 不要62(数位DP)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
随机推荐
- md5加密--32位16进制小写
public class ttgameMd5 { public final static String MD5(String str) { char hexDigits[] = { // 用来将字节转 ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的High-DefinitionVideo Processing Subsystem (HDVPSS)
High-DefinitionVideo Processing Subsystem (HDVPSS) 这一章介绍了高清视频处理子系统(HDVPSS). 2.1导论 2.1.1 简介 HDVPSS 使用 ...
- 数据库导入Excel-从基础做起
近期一直跟着师傅做考试系统的基础.每天与大量的数据打交道.数据的导入.数据的导出.视图的导入导出.核对信息等等,收获挺多的,培养了自己的耐心和细心,也进一步了解了数据库. 一切从基础做起! 来看看近期 ...
- iOS ARC也会有内存泄露
本文转载至 http://blog.csdn.net/allison162004/article/details/38753219 iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用A ...
- List和Set排序的实现
List.Set.Map的区别 List和Set继承了Collection接口. List以特定索引来存取元素,可以有重复元素.Set不能存放重复元素(用对象的equals()方法来区分元素是否重复) ...
- Manager模块 队列 管道 进程池
Manager模块 作用: 多进程共享变量. Manager的字典类型: 如果value是简单类型,比如int,可以直接赋值给共享变量,并可以后续直接修改 如果value是复杂类型 ,比如list, ...
- javascript修改图片链接地址
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- openCV图像形态学
#include <cv.h> #include <highgui.h> #include <stdio.h> //平滑处理 int main() { IplIma ...
- iOS 微信支付点击左上角返回解决方案
在网了搜了一些解决方案,感觉并不是那么严谨,于是自己动手搞了一下,直接说思路 iOS调起第三方支付和安卓还不一样,安卓是把第三方的支付SDK直接镶嵌在自己的App中,而iOS由于沙盒机制,各个应用之间 ...
- 我的Android进阶之旅------>四种呼叫转移场景
运行商为我们提供了如下4中呼叫转移场景: 1.始终进行呼叫转移:不管当前手机处于何种状态,来电都会被转移到指定的电话号码上.在使用这种呼叫转移时应当非常小心,如果启用了这种呼叫转移,你可就永远也接不着 ...