HDU2089-不要62-数位DP水题

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int dp[10][2];
 5 int digit[10];
 6 //len 长度 state 是否上位为6 limit 是否达到上限
 7 //dfs的值为,在digit数组限制下长度为len的数字的ans
 8 int dfs(int len , int state , bool limit)
 9 {
10     // 如果找到个位数,则返回1
11     if (len == 0) return 1;
12     //如果dfs到当前位置,数位没有限制,并且记忆化处理过len长度的数,则返回dp内容
13     if (!limit && dp[len][state]!=-1)
14         return dp[len][state];
15     int tans = 0;
16     //判断当前曾枚举范围,是0-9还是0-digit[len]
17     int limitD = limit ? digit[len] : 9;
18     //枚举当前位数字
19     for (int i = 0 ; i <= limitD ; i++)
20     {
21         //如果枚举到4,或者state==1(即上一位为6的情况下)且枚举到2,那么不满足要求,跳过
22         if ( i==4 || (state == 1 && i == 2) ) continue;
23         //dfs,len位为i,数字长len-1 ans,
24         //len-1
25         //当前位为6,即len的上一位为 6
26         //上一位有限制,并且当前位有限制,那么不能直接返回长
27         tans += dfs(len-1 , i==6?1:0 , limit && i == digit[len]);
28     }
29     //如果是无限制的len长度的数字ans,那么存下来
30     if (!limit) dp[len][state] = tans;
31     return tans;
32 }
33 int solve(int x)
34 {
35     int cnt = 0;
36     while (x!=0)
37     {
38        digit[++cnt] = x % 10;
39        x/=10;
40     }
41     return dfs(cnt,0,true);
42 }
43 int main()
44 {
45     memset(dp,-1,sizeof dp);
46     int a,b;
47     while (cin >> a >> b && a+b!=0)
48     {
49         cout << solve(b) - solve(a-1) <<endl;
50     }
51 }
时间: 2025-01-29 06:01:22

HDU2089-不要62-数位DP水题的相关文章

HDU 2089 不要62 (数位dp水题)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 32358    Accepted Submission(s): 11514 题目链接 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样

hdu2089不要62(数位dp)

题目大意就是数字中不能出现 62 和4 代码: /************************************************************************* > File Name: 2089.cpp > Author: minshik > Created Time: 2014年05月22日 星期四 00时52分49秒 *****************************************************************

HDU2089 不要62[数位DP]

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 36862    Accepted Submission(s): 13418 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可

hdu2089不要62(数位dp)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 43588    Accepted Submission(s): 16034 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可

bzoj 1026 [SCOI2009]windy数——数位dp水题

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 迷恋上用dfs写数位dp了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=15; int l,r,dg[N],dp[N][N]; int dfs(int p,int lst,bo

hdu2089 数位dp水题

#include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 10 ; int dp[maxn][3];//0什么都没有,1,有6,2有62或4 int bit[maxn] ; int dfs(int pos , int flag ,int lim) { if(pos == 0) return (flag !=2) ; if(dp[pos][fla

hdu 3555 数位dp水题 记忆化搜索做法

#include<iostream> #include<cstring> #include<cstdio> using namespace std ; const int maxn = 20; __int64 dp[maxn][3] ;//dp[i][flag] ,flag = 2,表示已经有49,flag == 1,表示没有49,这一位是4, int bit[maxn] ;    //flag == 0, 什么都没有 __int64 dfs(int pos , int

HDU 2089 不要62(数位dp)

题意:给定一个区间[n, m],求这个区间当中不含62和4的个数.例如62315,88914就是不符合条件的. 数位dp第一题,dp[i][j]表示以 j 开头的 i 位数满足条件的个数,先要预处理出来所有的情况, 下面是预处理的核心.其中k表示j后面的那一位.max_len是题目中给的n的最大位数,这里是7,第二层for是枚举第max_len - i位的值. for (int i = 1; i <= max_len; i++) { for (int j = 0; j <= 9; j++) {

URAL 1039 Anniversary Party 树形DP 水题

1039. Anniversary Party Time limit: 0.5 secondMemory limit: 8 MB Background The president of the Ural State University is going to make an 80'th Anniversary party. The university has a hierarchical structure of employees; that is, the supervisor rela

数位DP入门题 hdu 2089 hdu 3555

hdu 2089 不要62 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:对于每次给出的一个区间,找出区间内多少个数字没有出现62和4. 思路: 数位DP入门题,对于dfs设置3个参数. 一个表示现在进行到第几位, 一个表示前一个标记状态,这里表示上一位是不是6. 一个表示是否现在是这位可以取到的最大的数字. 如果上一位是6,那么这位不可以取2.且当前位都不可以取4. 1 #include <bits/stdc++.h> 2 us