hdu_5787_K-wolf Number(数位DP)

时间:2022-12-16 10:37:22

题目链接:hdu_5787_K-wolf Number

题意:

给你一个区间,让你找满足任意k个数位内都没有相同的数字的个数

题解:

因为k不大,就直接将当前pos的前k-1个数传进去就行了

hdu_5787_K-wolf Number(数位DP)hdu_5787_K-wolf Number(数位DP)
 1 #include<cstdio>
 2 #include<cstring>
 3 int dig[20],len,k;
 4 long long dp[20][11][11][11][11][2];
 5 
 6 long long dfs(int pos,int pre[],bool inf,bool ze=1)
 7 {
 8     if(!pos)return 1;
 9     long long *pp=&dp[pos][pre[1]][pre[2]][pre[3]][pre[4]][ze];
10     if(!inf&&(*pp)!=-1)return *pp;
11     int en=inf?dig[pos]:9;
12     long long ans=0;
13     for(int i=0;i<=en;i++){
14         int fg=0,pr[5];;
15         for(int j=1;j<k&&j<=len-pos&&ze==0;j++)if(i==pre[j]){fg=1;}
16         if(fg)continue;
17         for(int j=1;j<=4;j++)pr[j]=10;
18         for(int j=k-1;j>=2;j--)pr[j]=pre[j-1];
19         if(i==0&&ze)pr[1]=10;else pr[1]=i;
20         ans+=dfs(pos-1,pr,inf&&i==en,(i==0&&ze));
21     }
22     if(!inf)*pp=ans;
23     return ans;
24 }
25 
26 int main()
27 {
28     long long l,r;
29     while(~scanf("%lld%lld%d",&l,&r,&k)){
30         memset(dp,-1,sizeof(dp)),l--;
31         for(len=0;l;l/=10)dig[++len]=l%10;
32         int pre[5];
33         for(int i=1;i<=4;i++)pre[i]=10;
34         long long tmp=dfs(len,pre,1);
35         for(len=0;r;r/=10)dig[++len]=r%10;
36         for(int i=1;i<=4;i++)pre[i]=10;
37         printf("%lld\n",dfs(len,pre,1)-tmp);
38     }
39     return 0;
40 }
View Code