AcWing 338. 计数问题(数位dp)

这个题的意思是分别求 0 - 9 在 1 - n中出现的个数,是个数位动态规划的内容,难度还是比较大的。

题目

特殊情况:

  1. x在第1位上出现的次数(不用考虑前半段):
    bcdefg∈[00000,bcdefg] , ans += bcdefg+1
  2. x在最后一位上出现的次数(不用考虑后半段):

如果g 如果g==x,那么有一个这样的数,ans += 1
如果g>x,yyyyyy∈[000000,abcdef] , ans += abcdef+1
3) 如果我们枚举的数是0的话 :

0不能在第一位
而且枚举到的这一位前面不能全是0,即
xxx∈[001,abc-1]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;

class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw = new PrintWriter(System.out);

    public static void main(String[] args) throws IOException {
        String[] s;
        while (true) {
            s = br.readLine().split(" ");
            int a = Integer.parseInt(s[0]);
            int b = Integer.parseInt(s[1]);
            if (a == 0 && 0 == b) break;
            if (a > b) {
                int temp = a;
                a = b;
                b = temp;
            }
            for (int i = 0; i <= 9; i++) pw.print(count(b, i) - count(a - 1, i) + " ");
            pw.println();
        }
        pw.flush();
        pw.close();
        br.close();
    }

    public static int count(int n, int x) {
        if (n == 0) return 0;
        ArrayList<Integer> nums = new ArrayList<>();
        while (n != 0) {
            nums.add(n % 10);
            n /= 10;
        }
        n = nums.size();
        int res = 0;
        int bit = x == 0 ? 1 : 0;
        for (int i = n - 1 - bit; i >= 0; i--) {
            if (i < n - 1) {
                res += get(nums, n - 1, i + 1) * Math.pow(10, i);
                if (x == 0) res -= Math.pow(10, i);
            }
            if (nums.get(i) > x) res += Math.pow(10, i);
            else if (nums.get(i) == x) res += get(nums, i - 1, 0) + 1;
        }
        return res;
    }

    public static int get(ArrayList<Integer> al, int l, int r) {
        int res = 0;
        for (int i = l; i >= r; i--) res = res * 10 + al.get(i);
        return res;
    }


}

你可能感兴趣的:(动态规划)