zoukankan      html  css  js  c++  java
  • hdu5898_数位dp

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

    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
     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cstdio>
     6 #include <vector>
     7 #include <ctime>
     8 #include <queue>
     9 #include <list>
    10 #include <set>
    11 #include <map>
    12 using namespace std;
    13 #define INF 0x3f3f3f3f
    14 typedef long long LL;
    15 
    16 int bit[20];
    17 LL dp[20][20][2];dp[len][sum][tag]//前len 位,到当前为为止有num 个tag, tag=0 表示偶数,1为奇数
    18 LL dfs(int len, int zer, int num, int tag, int flag)
    19 {
    20     if(len < 1)
    21         return (num + tag) % 2 || (zer==0);
    22     if(flag && dp[len][num][tag] != -1)
    23         return dp[len][num][tag];
    24     int te = flag ? 9 : bit[len];
    25     LL sum = 0;
    26     for(int i = 0; i <= te; i++)
    27     {
    28         if(i % 2 == 0){
    29             if(zer == 0 && i == 0)
    30                 sum += dfs(len-1, 0, 0, 0, flag || i < te);
    31             else if(tag == 0)
    32                 sum += dfs(len-1, 1, num+1, tag, flag || i < te);
    33             else if(tag == 1 && num % 2 == 0)
    34                 sum += dfs(len-1, 1, 1, 0, flag || i < te);
    35         }
    36         if(i % 2 == 1){
    37             if(tag == 1)
    38                 sum += dfs(len-1, 1, num+1, tag, flag || i < te);
    39             else if(zer==0 || (tag == 0 && num % 2 == 1))
    40                 sum += dfs(len-1, 1, 1, 1, flag || i < te);
    41         }
    42     }
    43     if(flag)
    44         dp[len][num][tag] = sum;
    45     return sum;
    46 }
    47 LL solve(LL n)
    48 {
    49     memset(bit, 0, sizeof(bit));
    50     int len = 0;
    51     while(n)
    52     {
    53         bit[++len] = n % 10;
    54         n /= 10;
    55     }
    56     return dfs(len, 0, 0, 0, 0);
    57 }
    58 int main()
    59 {
    60     LL l, r;
    61     int t;
    62     scanf("%d", &t);
    63     memset(dp, -1, sizeof(dp));
    64     for(int ca = 1; ca <= t; ca++)
    65     {
    66         scanf("%lld%lld", &l, &r);
    67         printf("Case #%d: %lld
    ", ca, solve(r)-solve(l-1));
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    [knowledge][perl][pcre][sed] sed / PCRE 语法/正则表达式
    [knowledge][模式匹配] 字符匹配/模式匹配 正则表达式 自动机
    [daily] 内存越界的分析与定位
    [DPI] Cisco Application Visibility and Control
    [bigdata] palantir
    [daily][nfs] nfs客户端设置
    [knowledge][ETA] Encrypted Traffic Analytics
    [tcpreplay] tcpreplay高级用法--使用tcpreplay-edit进行循环动态发包
    [redhat][centos] 让不同小版本的CentOS7使用相同的内核版本
    [grub2] grub2修改启动顺序
  • 原文地址:https://www.cnblogs.com/luomi/p/5971162.html
Copyright © 2011-2022 走看看