数位DP
说明:
数位DP是为了解决某些数字匹配上面的问题,其中经典的写法是套用DFS算法实现数位DP。
视屏教学:
数位DP
E37 数位DP Windy数_哔哩哔哩_bilibili
这里说一下,前导零的意思,就是这个数字的前面都是零,比如说我们要dp的数字的最数字的位数为123。但是我们在进行dfs的DP的时候会从1开始,那么一开始我们从1开始dfs的时候那么就是001。也就是前面占位的都是零,也就叫做前导零。
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
import java.util.Arrays; import java.util.Scanner;
public class NumBitDP { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt();
System.out.println(a); }
public static long slove(int num){ int bit[] = new int[13];
int i =0; while(num!=0){ bit[++i] = num%10; num/=10; }
long dp[][] = new long[i+1][10]; for(int y = 0 ; y<=i ; ++y) Arrays.fill(dp[i],-1);
return dfs(dp,bit,i,0,true,true); }
public static long dfs(long dp[][],int bit[],int index,int preNum,boolean limit ,boolean zero){ if(index==0) return 1;
if(!zero && !limit && dp[index][preNum]!=-1) return dp[index][preNum];
int maxNum = limit?bit[index]:9; long ans = 0; for(int i = 0 ; i <=maxNum ; ++i){
if(zero && i==0) ans +=dfs(dp,bit,index-1,i,limit && i==bit[index] ? true:false,true); else ans+=dfs(dp,bit,index-1,i,limit && i==bit[index] ? true:false,false);
}
if(!zero && !limit) dp[index][preNum] = ans;
return ans; } }
|