8662 234的和
8662 234的和
⭐️难度:中等
🌟考点:模拟、二维前缀和
📖
📚
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int[] a = new int[15];
static long[][] dp = new long[15][100];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int l = sc.nextInt();
int r = sc.nextInt();
for(long x[] : dp){
Arrays.fill(x,-1);
}
System.out.println(f(r) - f(l - 1));
}
static long f(int x){
int cnt = 0;
while(x != 0){
a[++cnt] = x % 10;
x /= 10;
}
return dfs(true,cnt,0);
}
static long dfs(boolean lim,int pos,int sum){
if(pos == 0) return sum;
if(dp[pos][sum] != -1 && !lim) return dp[pos][sum]; // !lim
int up = lim ? a[pos] : 9;
long res = 0;
for(int i = 0;i <= up;i++){
if(i == 2 || i == 3 || i == 4){
res = res + dfs(lim && i == up,pos - 1,sum + i); // lim && i == up
}else{
res = res + dfs(lim && i == up,pos - 1,sum); // lim && i == up
}
}
if(!lim) dp[pos][sum] = res;
return res;
}
}
🍎笔记