码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划-数位dp-233. 数字 1 的个数

时间:2020-04-13 12:33:12      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:输出   public   个数   数字   计算   ret   数位   git   res   

2020-04-13 11:38:31

问题描述:

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

示例:

输入: 13
输出: 6 
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。

 

问题求解:

可以使用数位dp进行高效求解。

dp[pos][cnt] : 处理到当前数位之前一共出现了cnt个1,总共能得到的1的数量。

    int[] digits = new int[64];
    int[][] dp = new int[64][64];
    
    public int countDigitOne(int n) {
        if (n <= 0) return 0;  
        int pos = 0;
        while (n > 0) {
            digits[pos++] = n % 10;
            n /= 10;
        }
        return dfs(pos - 1, 0, true);
    }
    
    public int dfs(int pos, int cnt, boolean limit) {
        if (pos == -1) return cnt;
        if (!limit && dp[pos][cnt] != 0) return dp[pos][cnt];
        int up = limit ? digits[pos] : 9;
        int res = 0;
        for (int i = 0; i <= up; i++) {
            res += dfs(pos - 1, cnt + (i == 1 ? 1 : 0), limit && i == up);
        }
        if (!limit) dp[pos][cnt] = res;
        return res;
    }

  

 

动态规划-数位dp-233. 数字 1 的个数

标签:输出   public   个数   数字   计算   ret   数位   git   res   

原文地址:https://www.cnblogs.com/hyserendipity/p/12690375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!