hdu_5787_K-wolf Number(数位DP)
题意:
给你一个区间,让你找满足任意k个数位内都没有相同的数字的个数
题解:
因为k不大,就直接将当前pos的前k-1个数传进去就行了
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 }