• 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;
    }
    


  • 相关阅读:
    6-5 函数
    6-2 触发器
    4、MongoDB学习之备份还原
    3、MongoDB学习之固定集合
    2、MongoDB学习之索引的管理
    1、MongoDB学习之基本操作
    JS-01
    | 和 ||,& 和 && 的区别
    正则
    设计测试用例的经验总结
  • 原文地址:https://www.cnblogs.com/yaling/p/3657201.html
Copyright © 2020-2023  润新知