热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第K个字母顺序最小的二进制串,带有A0和B1

第K个字母顺序最小的二进制串,带有A0和B1原文:ht

第 K 个字母顺序最小的二进制串,带有 A0 和 B1

原文:https://www . geeksforgeeks . org/k-th-按字典顺序排列-最小-二进制-带-a-0s 和-b-1s 的字符串/

给定三个正整数 ABK ,任务是找到 K 个按字典顺序最小的 二进制字符串 ,该字符串恰好包含 0sA 数和 B1s 数。

示例:

输入: A = 2,B = 2,K = 4
输出: 1001
说明:字符串的字典顺序为 0011,0101,0110,1001。

输入: A = 3,B = 3,K = 7
T3】输出: 010110

方法:上述问题可以使用动态规划解决。请按照以下步骤解决此问题:


  • 初始化一个 2D 数组 dp[][] ,使得 dp[i][j]i0sj1s 来表示二进制字符串的总数。

  • 除了表示空字符串的 dp[0][0] = 1 之外,所有 dp 表值最初都用零填充。

  • 现在, dp[i][j] 可以计算为以 0 结尾的字符串总数(使用 dp 状态作为dp[I–1][j])和以 1 结尾的字符串总数(使用 DP 状态作为DP[I][j–1])之和。因此,当前 dp 状态计算为DP[I][j]= DP[I–1][j]+DP[I][j–1]

  • 填充此 dp 表后,可使用递归函数计算第 K 个字典最小二进制字符串。

  • 因此,定义一个函数 KthString ,该函数具有参数 A、B、Kdp

  • 现在,在这个递归函数的每次调用中:

    • 如果 dp[A][B]的值至少为 K ,则在第 K 个字典最小二进制字符串中的该位置只能出现“0”,然后递归调用状态(A–1,B) 的函数。

    • 否则“1”出现在这里,递归调用状态 (A,B–1)的函数。



  • 根据以上观察打印答案。

下面是上述方法的实现:

C++

// C++ program for the above approach
#include
using namespace std;
// Recursive function to find the Kth
// smallest binary string
string KthString(int A, int B, long long K,
                 vector >& dp)
{
    // Base Case
    if (A == 0) {
        // Return string of all 1's
        // of length B
        return string(B, '1');
    }
    if (B == 0) {
        // Return string of all 0's
        // of length A
        return string(A, '0');
    }
    if (K <= dp[A - 1][B]) {
        return "0" + KthString(
                         A - 1, B, K, dp);
    }
    else {
        return "1"
               + KthString(
                     A, B - 1,
                     K - dp[A - 1][B], dp);
    }
}
// Function to find the Kth lexicographically
// smallest binary string with exactly
// A zeroes and B ones
int KthStringUtil(int A, int B, int K)
{
    // Stores the recurring states
    vector > dp(
        A + 1, vector(B + 1));
    // Calculate the dp values iteratively
    dp[0][0] = 1;
    for (int i = 0; i <= A; ++i) {
        for (int j = 0; j <= B; ++j) {
            if (i > 0) {
                // The last character was '0'
                dp[i][j] += dp[i - 1][j];
            }
            if (j > 0) {
                // The last character was '1'
                dp[i][j] += dp[i][j - 1];
            }
        }
    }
    // Print the binary string obtained
    cout <    return 0;
}
// Driver Code
int main()
{
    int A = 3, B = 3, K = 7;
    KthStringUtil(A, B, K);
    return 0;
}

Java 语言(一种计算机语言,尤用于创建网站)

// Java program for the above approach
import java.io.*;
class GFG {
    // Recursive function to find the Kth
    // smallest binary string
    static String KthString(int A, int B, long K, int[][] dp)
    {
        // Base Case
        if (A == 0) {
            // Return string of all 1's
            // of length B
            String ans = "";
            for (int i = 0; i                 ans += '1';
            }
            return ans;
        }
        if (B == 0) {
            // Return string of all 0's
            // of length A
            String ans = "";
            for (int i = 0; i                 ans += '0';
            }
            return ans;
        }
        if (K <= dp[A - 1][B]) {
            return "0" + KthString(A - 1, B, K, dp);
        }
        else {
            return "1"
                + KthString(A, B - 1, K - dp[A - 1][B], dp);
        }
    }
    // Function to find the Kth lexicographically
    // smallest binary string with exactly
    // A zeroes and B ones
    static int KthStringUtil(int A, int B, int K)
    {
        // Stores the recurring states
        int[][] dp = new int[A + 1][B + 1];
        // Calculate the dp values iteratively
        dp[0][0] = 1;
        for (int i = 0; i <= A; ++i) {
            for (int j = 0; j <= B; ++j) {
                if (i > 0) {
                    // The last character was '0'
                    dp[i][j] += dp[i - 1][j];
                }
                if (j > 0) {
                    // The last character was '1'
                    dp[i][j] += dp[i][j - 1];
                }
            }
        }
        // Print the binary string obtained
        System.out.println(KthString(A, B, K, dp));
        return 0;
    }
    // Driver Code
    public static void main(String[] args)
    {
        int A = 3, B = 3, K = 7;
        KthStringUtil(A, B, K);
    }
}
// This code is contributed by Dharanendra L V.

Python 3

# Python Program to implement
# the above approach
# Recursive function to find the Kth
# smallest binary string
def KthString(A, B, K, dp):
    # Base Case
    if (A == 0):
        # Return string of all 1's
        # of length B
        str = ""
        for i in range(B):
            str += '1'
        return str
    if (B == 0):
        # Return string of all 0's
        # of length A
        str = ""
        for i in range(A):
            str += '0'
        return str
    if (K <= dp[A - 1][B]):
        return "0" + KthString( A - 1, B, K, dp)
    else:
        return "1" + KthString( A, B - 1, K - dp[A - 1][B], dp)
# Function to find the Kth lexicographically
# smallest binary string with exactly
# A zeroes and B ones
def KthStringUtil(A, B, K):
    # Stores the recurring states
    dp = [0] * (A + 1)
    for i in range(len(dp)):
        dp[i] = [0] * (B + 1)
    # Calculate the dp values iteratively
    dp[0][0] = 1
    for i in range(A + 1):
        for j in range(B + 1):
            if (i > 0):
                # The last character was '0'
                dp[i][j] += dp[i - 1][j]
            if (j > 0):
                # The last character was '1'
                dp[i][j] += dp[i][j - 1]
    # Print the binary string obtained
    print(KthString(A, B, K, dp))
# Driver Code
A = 3
B = 3
K = 7
KthStringUtil(A, B, K)
# This code is contributed by gfgking.

C

// C# program for the above approach
using System;
class GFG {
    // Recursive function to find the Kth
    // smallest binary string
    static string KthString(int A, int B, long K,
                            int[, ] dp)
    {
        // Base Case
        if (A == 0) {
            // Return string of all 1's
            // of length B
            string ans = "";
            for (int i = 0; i                 ans += '1';
            }
            return ans;
        }
        if (B == 0) {
            // Return string of all 0's
            // of length A
            string ans = "";
            for (int i = 0; i                 ans += '0';
            }
            return ans;
        }
        if (K <= dp[A - 1, B]) {
            return "0" + KthString(A - 1, B, K, dp);
        }
        else {
            return "1"
                + KthString(A, B - 1, K - dp[A - 1, B], dp);
        }
    }
    // Function to find the Kth lexicographically
    // smallest binary string with exactly
    // A zeroes and B ones
    static int KthStringUtil(int A, int B, int K)
    {
        // Stores the recurring states
        int[, ] dp = new int[A + 1, B + 1];
        // Calculate the dp values iteratively
        dp[0, 0] = 1;
        for (int i = 0; i <= A; ++i) {
            for (int j = 0; j <= B; ++j) {
                if (i > 0) {
                    // The last character was '0'
                    dp[i, j] += dp[i - 1, j];
                }
                if (j > 0) {
                    // The last character was '1'
                    dp[i, j] += dp[i, j - 1];
                }
            }
        }
        // Print the binary string obtained
        Console.WriteLine(KthString(A, B, K, dp));
        return 0;
    }
    // Driver Code
    public static void Main(string[] args)
    {
        int A = 3, B = 3, K = 7;
        KthStringUtil(A, B, K);
    }
}
// This code is contributed by ukasp.

java 描述语言


Output: 

010110

时间复杂度: O(AB)*
辅助空间: O(AB)*


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
author-avatar
山间农夫的家
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有