HDU 3652:B-number(数位DP)

http://acm.hdu.edu.cn/showproblem.php?pid=3652

题意:求数位含有13和可以被13整除的数字个数。

思路:记录3种状态:

st == 0 表示 从最高位到第 i 位既不包含 “13” 末尾也不包含 “1”。

st == 1 表示 末尾包含 “1”。

st == 2 表示 从最高位到第 i 位含有 “13”。

可以被 13 整除的话用一个参数来记录从最高位到第 i 位的和对 13 取模,当 mod == 0 && st == 2 的时候代表含有 “13” 并且可以被 13 整除。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <string>
 6 #include <cmath>
 7 #include <queue>
 8 #include <vector>
 9 using namespace std;
10 #define N 505
11 #define INF 0x3f3f3f3f
12 int dp[20][20][3];
13 int  bit[20];
14
15 int dfs(int pos, int mo, int st, int limit)
16 {
17     if(pos <= 0) return st == 2 && mo == 0;
18     if(limit && ~dp[pos][mo][st]) return dp[pos][mo][st];
19     int d = limit ? 9 : bit[pos];
20     int ans = 0;
21     for(int i = 0; i <= d; i++) {
22         int ss = st;
23         int me = (mo  * 10 + i) % 13;
24         if(st != 2 && i != 1) ss = 0;
25         if(st != 2 && i == 1) ss = 1;
26         if(st == 1 && i == 3) ss = 2;
27         ans += dfs(pos - 1, me, ss, limit || i != d);
28     }
29     if(limit) dp[pos][mo][st] = ans;
30     return ans;
31 }
32
33 int solve(int num)
34 {
35     int len = 0;
36     while(num) {
37         bit[++len] = num % 10;
38         num /= 10;
39     }
40     return dfs(len, 0, 0, 0);
41 }
42
43 int main()
44 {
45     int num;
46     while(~scanf("%d", &num)) {
47         memset(dp, -1, sizeof(dp));
48         printf("%d\n", solve(num));
49     }
50     return 0;
51 }
时间: 2024-10-09 12:52:08

HDU 3652:B-number(数位DP)的相关文章

hdu 5787 K-wolf Number 数位dp

数位DP 神模板 详解 为了方便自己参看,我把代码复制过来吧 // pos = 当前处理的位置(一般从高位到低位) // pre = 上一个位的数字(更高的那一位) // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, // 给计数器+1. // limit = 是否受限,也即当前处理这位能否随便取值.如567,当前处理6这位, // 如果前面取的是4,则当前这位可以取0-9.如果前面取的5,那么当前 // 这位就不能随便取,不然会超出这个数的范围,所以如果前面取

hdu 5898 odd-even number 数位DP

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 716    Accepted Submission(s): 385 Problem Description For a number,if the length of continuous odd digits is even and the length

HDU 3709 Balanced Number (数位DP)

Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 3798    Accepted Submission(s): 1772 Problem Description A balanced number is a non-negative integer that can be balanced if a pi

hdu 5898 odd-even number(数位dp)

Problem Description For a number,if the length of continuous odd digits is even and the length of continuous even digits is odd,we call it odd-even number.Now we want to know the amount of odd-even number between L,R(1<=L<=R<= 9*10^18). Input Fir

hdu 3565 Bi-peak Number 数位dp

题意:各位数字先增后减的数称为峰值数(位数大于等3且第一位非零),然后两个峰值数连在一起是一个Bi-peak数, 求两个数之间Bi-peak数的各位数字之和的最大值. 思路:设dp[pos][i][j]表示当前考虑pos位,之前的数位为i,状态为j,与之后(pos+1)位组合构成Bi-peak number,这(pos+1)位数位和的 最大值.状态总共有7种,st=0,初始状态:st=1,恰好有一个在第一个波峰的上坡上:st=2,前面至少有两个在第一个波峰的上 坡上; st=3,在第一个波峰的下

HDU 3652 B-number(数位DP)

题意:统计区间 [1,n] 中含有 '13' 且模 13 为 0 的数字有多少个. 分析:由 (HDU 2089 不要62)和(CF 55D - Beautiful numbers)想到该题做法,dp[i][j][f][mod],长度为i,前缀是否为1,是否已符合条件,余数为mod的数字个数. #include <map> #include <set> #include <list> #include <cmath> #include <queue&g

HDU 2089 不要62(数位DP,三种姿势)

HDU 2089 不要62(数位DP,三种姿势) ACM 题目地址:HDU 2089 题意: 中文题意,不解释. 分析: 100w的数据,暴力打表能过 先初始化dp数组,表示前i位的三种情况,再进行推算 直接dfs,一遍搜一变记录,可能有不饥渴的全部算和饥渴的部分算情况,记录只能记录全部算(推荐看∑大的详细题解Orz) 代码: 1. 暴力 (以前写的) /* * Author: illuz <iilluzen[at]gmail.com> * File: 2089_bf.cpp * Create

hdu 3555 Bomb(数位dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题目大意:就是给你一个数n,判断从0到n有多少个数含有数字49...... 是不是觉得跟hdu2089很相似呀... 思路:跟hdu2089一样的,注意给出的数比较大,所以这儿用__int64  .... code: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm&

[ACM] hdu 2089 不要62(数位Dp)

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

Hdu3079Balanced Number数位dp

枚举支点,然后就搞,记录之前的点的力矩和. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <s