zoukankan      html  css  js  c++  java
  • 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp

    odd-even number

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 388    Accepted Submission(s): 212


    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
    First line a t,then t cases.every line contains two integers L and R.
     
    Output
    Print the output for each case on one line in the format as shown below.
     
    Sample Input
    2 1 100 110 220
     
    Sample Output
    Case #1: 29
    Case #2: 36
     
    Source
     题意:一个数字,它每个数位上的奇数都形成偶数长度的段,偶数位都形成奇数长度的段他就是好的。问[L , R]的好数个数。
     题解:用dp[i][j]表示第i位数前一位数的状态是j。状态有4种,1-奇数长度为奇,2-奇数长度为偶,3-偶数长度为奇,4-偶数长度为偶
    外加一个状态flag=0表示当前这一位之前都是前导零  (注意各个状态之间的转换已经记忆化)
      1 /******************************
      2 code by drizzle
      3 blog: www.cnblogs.com/hsd-/
      4 ^ ^    ^ ^
      5  O      O
      6 ******************************/
      7 //#include<bits/stdc++.h>
      8 #include<iostream>
      9 #include<cstring>
     10 #include<cmath>
     11 #include<cstdio>
     12 #define ll long long
     13 #define mod 1000000007
     14 #define PI acos(-1.0)
     15 using namespace std;
     16 int t;
     17 ll l,r;
     18 int num[25];
     19 ll dp[25][5];
     20 /*
     21 1 奇奇
     22 2 奇偶
     23 3 偶奇
     24 4 偶偶
     25 */
     26 ll dfs(int pos,int status,int flag)
     27 {
     28     if(pos<1)
     29     {
     30         if(status==2||status==3)
     31              return 1;
     32         else
     33              return 0;
     34     }
     35     if(!flag&&dp[pos][status])
     36         return dp[pos][status];
     37     int end=flag ? num[pos] : 9;//如果之前都是前导零 则当前这位可以取0~9
     38     ll ans=0;
     39     for(int i=0;i<=end;i++)
     40     {
     41         if(!status)
     42         {
     43             if(!i)
     44             {
     45                 ans=dfs(pos-1,0,0);
     46             }
     47             else if(i&1)
     48             {
     49                 ans+=dfs(pos-1,1,flag&&i==end);
     50             }
     51             else
     52             {
     53                 ans+=dfs(pos-1,3,flag&&i==end);
     54             }
     55 
     56         }
     57         else
     58         {
     59             if(status==1){
     60                 if(i&1){
     61                     ans+=dfs(pos-1,2,flag&&i==end);
     62                 }
     63             }
     64             else if(status==2){
     65                 if(i&1){
     66                     ans+=dfs(pos-1,1,flag&&i==end);
     67                 }
     68                 else{
     69                     ans+=dfs(pos-1,3,flag&&i==end);
     70                 }
     71             }
     72             else if(status==3){
     73                 if(i&1){
     74                     ans+=dfs(pos-1,1,flag&&i==end);
     75                 }
     76                 else
     77                     ans+=dfs(pos-1,4,flag&&i==end);
     78             }
     79             else{
     80                 if(!(i&1))
     81                 {
     82                     ans+=dfs(pos-1,3,flag&&i==end);
     83                 }
     84             }
     85         }
     86     }
     87     dp[pos][status]=ans;
     88     return ans;
     89 }
     90 ll slove(ll x)
     91 {
     92     memset(dp,0,sizeof(dp));
     93     int len=0;
     94     while(x)
     95     {
     96         num[++len]=x%10;
     97         x/=10;
     98     }
     99     return dfs(len,0,1);
    100 }
    101 int main()
    102 {
    103         scanf("%d",&t);
    104         for(int i=1;i<=t;i++)
    105         {
    106             scanf("%I64d %I64d",&l,&r);
    107             printf("Case #%d: %I64d
    ",i,slove(r)-slove(l-1));
    108         }
    109     return 0;
    110 }
  • 相关阅读:
    LeetCode 226. Invert Binary Tree
    LeetCode 221. Maximal Square
    LeetCode 217. Contains Duplicate
    LeetCode 206. Reverse Linked List
    LeetCode 213. House Robber II
    LeetCode 198. House Robber
    LeetCode 188. Best Time to Buy and Sell Stock IV (stock problem)
    LeetCode 171. Excel Sheet Column Number
    LeetCode 169. Majority Element
    运维工程师常见面试题
  • 原文地址:https://www.cnblogs.com/hsd-/p/5887181.html
Copyright © 2011-2022 走看看