数位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 using namespace std;
 3 int dp[10][2], num[10];
 4 int dfs(int cur, int state, int limit)
 5 {
 6     if(cur < 0) return 1;
 7     if(!limit && dp[cur][state] != -1) return dp[cur][state];
 8
 9     int ret = 0;
10     int up = limit?num[cur]:9;
11     for(int i = 0; i <= up; i++)
12     {
13         if(state == 1 && i == 2 || i == 4) continue;
14         else ret += dfs(cur-1, i == 6, limit && i == up);
15     }
16     if(!limit) dp[cur][state] = ret;
17     return ret;
18
19 }
20 int slove(int x)
21 {
22     memset(dp, -1, sizeof(dp));
23     int cnt = 0;
24     while(x)
25     {
26         num[cnt++] = x % 10;
27         x /= 10;
28     }
29     return dfs(cnt-1, 0, 1);
30 }
31 int main()
32 {
33   //  freopen("in.txt", "r", stdin);
34   //  freopen("out.txt", "w", stdout);
35     int n, m;
36     while(~scanf("%d%d", &n, &m) && n+m)
37     {
38         printf("%d\n", slove(m) - slove(n-1));
39     }
40     return 0;
41 }

hdu 3555 bomb

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555

题意:找出1-N中出现49的数字个数。

思路:和上题差不多,如果前几位出现4,则这位不能出现9。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int T;
 4 int num[30];
 5 long long dp[30][2];
 6 long long dfs(int cur, int state, int limit)
 7 {
 8     if(cur < 0) return 1;
 9     if(!limit && dp[cur][state] != -1) return dp[cur][state];
10
11     long long ret = 0;
12     int up = limit?num[cur]:9;
13     for(int i = 0; i <= up; i++)
14     {
15         if(state && i == 9) continue;
16         ret += dfs(cur-1, i == 4, limit && i == up);
17     }
18     if(!limit) dp[cur][state] = ret;
19     return ret;
20 }
21 long long slove(long long x)
22 {
23     memset(dp, -1, sizeof(dp));
24     int cnt = 0;
25     while(x)
26     {
27         num[cnt++] = x%10;
28         x /= 10;
29     }
30     return dfs(cnt-1, 0, 1);
31 }
32 long long N;
33 int main()
34 {
35   // freopen("in.txt", "r", stdin);
36   //  freopen("out.txt", "w", stdout);
37     scanf("%d", &T);
38     while(T--)
39     {
40         scanf("%lld", &N);
41         printf("%lld\n", N+1-slove(N));
42     }
43
44     return 0;
45 }
时间: 2024-12-08 18:27:16

数位DP入门题 hdu 2089 hdu 3555的相关文章

HDU 2089 不要62【数位DP入门题】

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

hdu3555 Bomb (数位dp入门题)

Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 19698    Accepted Submission(s): 7311 Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists

xbz分组题B 吉利数字 数位dp入门

B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第一行为样例个数N.接下来N行,每一行代表一个输入样例,每个输入样例有2个数,分别代表某个区间的起点a和终点b.注意所求区间为[a,b],1<=a<=b<=10^9 [输出]N行.对于第x个输入样例,在第x行输入该样例所对应的结果. [输入样例]21 101 20 [输出样例]01 [Hint

HDU 2089 不要62 数位DP入门

Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 73418 88914都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列.你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多

hdu 5001 walk 概率dp入门题

Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will travel t

数位DP入门

数位DP其实是很灵活的,所以一定不要奢求一篇文章就会遍所有数位DP的题,这一篇只能是讲清楚一种情况,其他情况遇到再总结,在不断总结中慢慢体会这个思想,以后说不定就能达到一看到题目就能灵活运用的水平.(其实DP都是这样……) 这一篇要说的数位DP是一道最简单的数位DP:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目大意:多组数据,每次给定区间[n,m],求在n到m中没有“62“或“4“的数的个数. 如62315包含62,88914包含4,这两个数

【dp入门题】【跟着14练dp吧...囧】

A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = a[n][j]; 其中dp[i][j]: 深度为i的第j个结点的最大和; 1 /* 2 Problem: HDU-2048 3 Tips: Easy DP 4 dp[i][j]: 深度为i的第j个结点的最大和: 5 dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+

Hdu-1565 方格取数(1) (状态压缩dp入门题

方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4702    Accepted Submission(s): 1782 Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出

poj 3254 状压dp入门题

1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相邻,求有多少种放法. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #d