zoukankan      html  css  js  c++  java
  • 【USACO 3.2】Stringsobits (dp)

    题意:求第k大的最多有l个1的n位二进制。

    题解:dp[i][j]表示长度为i最多有j个1的二进制有多少种,则有:

    状态转移:dp[i][j]=dp[i-1][j]+dp[i-1][j-1],即第i位放1或者0。

    边界条件:dp[0][i]=1,dp[i][0]=1。

    长度为n,最多m个1的二进制可以分为:

    以0开始的一部分,共有dp[n-1][m]个,

    和以1开始的一部分,共有dp[n-1][m-1]个。

    如果dp[n-1][m]≥k,说明第k大的就在0开始的那一部分的第k大的,

    否则就是1开始的那一部分的第k-dp[n-1][m]大的。

    问题就转化为求长度n-1,最多m或m-1个1的二进制的第k或k-dp[n-1][m]大的是谁。

    /*
    TASK:kimbits
    LANG:C++
     */
    #include<cstdio>
    int n,l;
    long long dp[40][40],k;
    int main(){
        freopen("kimbits.in","r",stdin);
        freopen("kimbits.out","w",stdout);
        scanf("%d%d%lld",&n,&l,&k);                                
        for(int i=0;i<=n;i++)dp[0][i]=1;
        for(int i=1;i<=n;i++){
            dp[i][0]=1;
            for(int j=1;j<=l;j++)
                dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
        }   
        for(int i=1;i<=n;i++)
            if(dp[n-i][l]>=k)printf("0");
            else{
                printf("1");
                k-=dp[n-i][l];
                l--;
            }   
        puts("");
        return 0;   
    }

      

  • 相关阅读:
    get通配符
    常用正则表达式(合)
    2.A star
    1.序
    机器人运动规划04《规划算法》
    机器人运动规划03什么是运动规划
    6.2 性能优化
    6.1 内存机制及使用优化
    5.9 热修复技术
    5.8 反射机制
  • 原文地址:https://www.cnblogs.com/flipped/p/6077749.html
Copyright © 2011-2022 走看看