hdu_5898_odd-even number(数位DP)

题目链接:hdu_5898_odd-even number

题意:

给你一个区间,问你这个区间中满足连续的偶数的位数为奇数,连续的奇数的位数是偶数的个数

题解:

设dp[i][j][k][l]为考虑当前第i位,上一位的奇偶性为j,已经连续了k位,是否有前导零

然后记忆化搜就行了

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 typedef long long ll;
 5
 6 int dig[20],len;
 7 ll dp[20][2][20][2];
 8
 9 ll dfs(int pos,int pre=0,int ln=0,bool inf=1,bool ze=1)//pre 1为奇,0为偶
10 {
11     if(!pos)
12     {
13         if(pre)return (ln&1)==0;
14         else return ln&1;
15     }
16     if(!inf&&dp[pos][pre][ln][ze]!=-1)return dp[pos][pre][ln][ze];
17     int en=inf?dig[pos]:9;ll ans=0;
18     F(i,0,en)
19     {
20         if(i&1)
21         {
22             if(ze)
23             {
24                 if(i==0)ans+=dfs(pos-1,0,0,inf&&i==en,1);
25                 else ans+=dfs(pos-1,1,1,inf&&i==en,0);
26             }
27             else if(pre==0)
28             {
29                 if(ln&1)ans+=dfs(pos-1,1,1,inf&&i==en,ze);
30             }else if(pre==1)
31             {
32                 ans+=dfs(pos-1,1,ln+1,inf&&i==en,ze);
33             }
34         }else
35         {
36             if(ze)
37             {
38                 if(i==0)ans+=dfs(pos-1,0,0,inf&&i==en,1);
39                 else ans+=dfs(pos-1,0,1,inf&&i==en,0);
40             }
41             else if(pre==0)ans+=dfs(pos-1,0,ln+1,inf&&i==en,ze);
42             else if(pre==1)
43             {
44                 if((ln&1)==0)ans+=dfs(pos-1,0,1,inf&&i==en,ze);
45             }
46         }
47     }
48     if(!inf)dp[pos][pre][ln][ze]=ans;
49     return ans;
50 }
51
52 int main(){
53     int t,ic=1;ll l,r;
54     scanf("%d",&t);
55     while(t--)
56     {
57         memset(dp,-1,sizeof(dp));
58         scanf("%lld%lld",&l,&r),l--;
59         for(len=0;l;l/=10)dig[++len]=l%10;
60         ll tp=dfs(len);
61         for(len=0;r;r/=10)dig[++len]=r%10;
62         printf("Case #%d: %lld\n",ic++,dfs(len)-tp);
63     }
64     return 0;
65 }

时间: 2024-10-25 19:53:51

hdu_5898_odd-even number(数位DP)的相关文章

Hdu3079Balanced Number数位dp

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

SPOJ MYQ10 Mirror Number 数位dp&#39;

题目链接:点击打开链接 MYQ10 - Mirror Number A number is called a Mirror number if on lateral inversion, it gives the same number i.e it looks the same in a mirror. For example 101 is a mirror number while 100 is not. Given two numbers a and b, find the number

多校5 HDU5787 K-wolf Number 数位DP

1 // 多校5 HDU5787 K-wolf Number 数位DP 2 // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d 3 // f 用作标记,当现在枚举的数小于之前的数时,就不用判断i与dig[pos]的大小 4 // 整体来说就,按位往后移动,每次添加后形成的数都小于之前的数,并且相邻k位不一样,一直深搜到cnt位 5 // http://blog.csdn.net/weizhuwyzc000/article/details/5209769

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 5787 K-wolf Number 数位dp

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

codeforces Hill Number 数位dp

http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits:  200000 KB 64-bit interger IO format:  %lld   Java class name:  Main Description A Hill Number is a number whose digits possibly rise and then possibl

fzu 2109 Mountain Number 数位DP

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则这个数为Mountain Number. 给出L, R,求区间[L, R]有多少个Mountain Number. 思路: 数位DP,判断当前是偶数位还是奇数位(从0开始),如果是偶数位,那么它要比前一个数的值小, 如果是奇数位,那么它要比前一个数的值大. 1 #include <iostream>

hdu3709---Balanced Number(数位dp)

Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit. When a pivot is placed at some digit of the nu

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