zoukankan      html  css  js  c++  java
  • HDU 3555 Bomb 简单数位DP

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

    题目大意:给出一个数N,在[1, N]中找出有多少个数字含有连续的“49”,是一道简单的数位DP, 可以拿来做模板……

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    typedef __int64 LL;
    
    LL digits[30];
    LL dp[30][10][2];
    
    // len表示当前在第几位,pre表示前一位数字是多少,flag表示是否含有49,
    // limit表示当前位的数字是否有限制, [0,9] OR [0,digits[len]]; 
    LL dfs(int len, int pre, int flag, int limit) {
        if(len == 0) return flag == 1;
    
        if(!limit && dp[len][pre][flag] != -1) return dp[len][pre][flag];
    
        int end = limit ? digits[len] : 9;
    
        LL sum = 0;
        for(int i = 0; i <= end; ++i) {
            sum += dfs(len-1, i, (flag || (pre==4 && i==9)), (limit && end==i));
        }
    
        return limit ? sum : dp[len][pre][flag] = sum;
    }
    
    LL cal(LL n) {
        int len = 0;
        while(n) {
            digits[++len] = n % 10;
            n /= 10;
        }
        return dfs(len, -1, 0, 1);
    }
    
    
    int main() {
        int t;
        memset(dp, -1, sizeof(dp));
        LL n;
        scanf("%d
    ", &t);
        while(t--) {
            scanf("%I64d", &n);
            printf("%I64d
    ", cal(n));
        }
        return 0;
    }
    


  • 相关阅读:
    ARC 117 D
    Maven依赖踩坑记录
    MobaXterm连接本地CentOS7
    Git在IDEA下的常用操作
    mq消息中间件
    nginx的作用
    Git的使用
    docker
    redis
    导出excel
  • 原文地址:https://www.cnblogs.com/yaling/p/3657201.html
Copyright © 2011-2022 走看看