1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class Solution {
public int count(String num1, String num2, int min_sum, int max_sum) {
return (countGood(num2, min_sum, max_sum) - countGood(dec(num1), min_sum, max_sum) + 1_000_000_007) % 1_000_000_007;
}
private int countGood(String num, int min_sum, int max_sum) {
int n = num.length();
int[] digits = new int[n];
for (int i = 0; i < n; i++) digits[i] = num.charAt(i) - '0';
Integer[][][][] memo = new Integer[n][410][2][2];
return dp(0, 0, 1, 1, digits, min_sum, max_sum, memo);
}
private int dp(int pos, int sum, int tight, int lead, int[] digits, int min_sum, int max_sum, Integer[][][][] memo) {
if (sum > max_sum) return 0;
if (pos == digits.length) return (lead == 0 && sum >= min_sum && sum <= max_sum) ? 1 : 0;
if (memo[pos][sum][tight][lead] != null) return memo[pos][sum][tight][lead];
int up = tight == 1 ? digits[pos] : 9, res = 0;
for (int d = 0; d <= up; d++) {
res = (res + dp(pos+1, sum+d, tight==1 && d==up ? 1 : 0, lead==1 && d==0 ? 1 : 0, digits, min_sum, max_sum, memo)) % 1_000_000_007;
}
return memo[pos][sum][tight][lead] = res;
}
private String dec(String s) {
char[] arr = s.toCharArray();
for (int i = arr.length-1; i >= 0; i--) {
if (arr[i] > '0') { arr[i]--; break; } arr[i] = '9';
}
return new String(arr);
}
}
|