• hdu_5787_K-wolf Number(数位DP)


    题目链接:hdu_5787_K-wolf Number

    题意:

    给你一个区间,让你找满足任意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
    ",dfs(len,pre,1)-tmp);
    38     }
    39     return 0;
    40 }
    View Code
  • 相关阅读:
    POJ
    hdu 5652
    CodeForces
    #6285. 数列分块入门 9
    #6284. 数列分块入门 8
    #6283. 数列分块入门 7
    #6282. 数列分块入门 6
    #6280. 数列分块入门 4 #6281. 数列分块入门 5
    #6278. 数列分块入门 2和#6278. 数列分块入门 3
    spark-sklearn TypeError: 'JavaPackage' object is not callable
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5731003.html
Copyright © 2020-2023  润新知