zoukankan      html  css  js  c++  java
  • HDU 2089:不要62(数位DP)

    类型:数位DP

    题意:定义一个好的数为 没有出现“4”和“62” 这样的数。问[n,m]之间有多少这样的数。(0<n≤m<1000000)

    思路:

    简单的数位DP

    定义状态

    dp[i][d]为 d开头的i位数中 好数的个数

    dp[i][d] = sum(dp[i-1][0,1,3,5~9]) + (d!=6)*(dp[i-1][2]);

    出口:dp[1][0~9] = 1;

    代码:

    #include <cstdio>
    #include <cstring>
    
    int dp[15][10];
    int num[120];
    
    int dfs(int i, int now, bool iscount) 
    {
        if (!iscount && dp[i][now] != -1) return dp[i][now];
        if (i == 1) {
            if (now == 4) return dp[i][now] = 0;
            else return dp[i][now] = 1;
        }
        int end = iscount?num[i-1]:9;
        int ans = 0;
        for (int d = 0; d <= end; d++) {
            if ((now == 6 && d == 2) || d == 4) continue;
            ans += dfs(i-1, d, iscount && d == end);
        }
        if (!iscount) dp[i][now] = ans;
        return ans;
    }
    
    int cal(int x) {
        int len = 0;
        while (x) {
            num[++len] = x%10;
            x /= 10;
        }
        return dfs(len+1, 0, 1);
    }
    
    int main(){ 
        int n, m;
        while (scanf("%d%d", &n, &m) != EOF) {
            if (n == 0 && m == 0) return 0;
            memset(dp, -1, sizeof(dp));
            printf("%d
    ", cal(m)-cal(n-1));
        }
        return 0;
    }
  • 相关阅读:
    Java多态性理解
    多态详解
    public static void main(String[] args){}函数诠释
    继承、封装
    面向对象的理解
    重载与构造函数的解析
    冒泡排序及二分查找
    数组总结之补充
    计算机中如何表示数字-07IEEE754浮点数标准
    synchronized 和ReentrantLock
  • 原文地址:https://www.cnblogs.com/shinecheng/p/3599268.html
Copyright © 2011-2022 走看看