📜  使用插入、删除和复制操作写入字符的最短时间

📅  最后修改于: 2021-09-22 10:35:31             🧑  作者: Mango

我们需要在屏幕上写N个相同的字符,每次我们可以插入一个字符,删除最后一个字符,复制粘贴所有写入的字符,即复制操作后写入的字符总数将变为两倍。现在我们有时间进行插入、删除和复制。我们需要使用这些操作输出在屏幕上写入 N 个字符的最短时间。

例子:

Input : N = 9    
        insert time = 1    
        removal time = 2    
        copy time = 1
Output : 5
N character can be written on screen in 5 time units as shown below,
insert a character    
characters = 1  total time = 1
again insert character      
characters = 2  total time = 2
copy characters             
characters = 4  total time = 3
copy characters             
characters = 8  total time = 4
insert character           
characters = 9  total time = 5

我们可以使用动态规划来解决这个问题。我们可以在手工解决一些示例后观察到一个模式,对于编写每个字符,我们有两种选择,要么通过插入获得它,要么通过复制获得它,以花费较少的时间为准。现在相应地写关系,
让 dp[i] 成为在屏幕上写 i 个字符的最佳时间,然后,

If i is even then,
   dp[i] = min((dp[i-1] + insert_time), 
               (dp[i/2] + copy_time))
Else (If i is odd)
   dp[i] = min(dp[i-1] + insert_time),
              (dp[(i+1)/2] + copy_time + removal_time)

在奇数的情况下,删除时间增加,因为当复制 (i+1)/2 个字符时,屏幕上会出现一个需要删除的额外字符。

C++
// C++ program to write characters in
// minimum time by inserting, removing
// and copying operation
#include 
using namespace std;
 
//  method returns minimum time to write
// 'N' characters
int minTimeForWritingChars(int N, int insert,
                       int remove, int copy)
{
    if (N == 0)
       return 0;
    if (N == 1)
       return insert;
 
    //  declare dp array and initialize with zero
    int dp[N + 1];
    memset(dp, 0, sizeof(dp));
 
    // first char will always take insertion time
    dp[1] = insert;
 
    //  loop for 'N' number of times
    for (int i = 2; i <= N; i++)
    {
        /*  if current char count is even then
            choose minimum from result for (i-1)
            chars and time for insertion and
            result for half of chars and time
            for copy  */
        if (i % 2 == 0)
            dp[i] = min(dp[i-1] + insert,
                        dp[i/2] + copy);
 
        /*  if current char count is odd then
            choose minimum from
            result for (i-1) chars and time for
            insertion and
            result for half of chars and time for
            copy and one extra character deletion*/
        else
            dp[i] = min(dp[i-1] + insert,
                        dp[(i+1)/2] + copy + remove);
    }
    return dp[N];
}
 
// Driver code
int main()
{
    int N = 9;
    int insert = 1, remove = 2, copy = 1;
    cout << minTimeForWritingChars(N, insert,
                                remove, copy);
    return 0;
}


Java
// Java program to write characters in
// minimum time by inserting, removing
// and copying operation
 
public class GFG{
     
    // method returns minimum time to write
    // 'N' characters
    static int minTimeForWritingChars(int N, int insert,
                                      int remove, int copy)
    {
        if (N == 0)
        return 0;
        if (N == 1)
        return insert;
     
        // declare dp array and initialize with zero
        int dp[] = new int [N + 1];
         
          // first char will always take insertion time
          dp[1] = insert;
     
        // loop for 'N' number of times
        for (int i = 2; i <= N; i++)
        {
            /* if current char count is even then
                choose minimum from result for (i-1)
                chars and time for insertion and
                result for half of chars and time
                for copy */
            if (i % 2 == 0)
                dp[i] = Math.min(dp[i-1] + insert, dp[i/2] + copy);
     
            /* if current char count is odd then
                choose minimum from
                result for (i-1) chars and time for
                insertion and
                result for half of chars and time for
                copy and one extra character deletion*/
            else
                dp[i] = Math.min(dp[i-1] + insert,
                                 dp[(i+1)/2] + copy + remove);
        }
        return dp[N];
    }
     
    // Driver code to test above methods
    public static void main(String []args)
    {
        int N = 9;
        int insert = 1, remove = 2, copy = 1;
        System.out.println(minTimeForWritingChars(N, insert,remove, copy));
    }
    // This code is contributed by Ryuga
}


Python3
# Python3 program to write characters in
# minimum time by inserting, removing
# and copying operation
 
def minTimeForWritingChars(N, insert,
                           remov, cpy):
     
    # method returns minimum time
    # to write 'N' characters
    if N == 0:
        return 0
    if N == 1:
        return insert
 
    # declare dp array and initialize
    # with zero
    dp = [0] * (N + 1)
     
    # first char will always take insertion time
    dp[1] = insert
     
    # loop for 'N' number of times
    for i in range(2, N + 1):
 
        # if current char count is even then
        # choose minimum from result for (i-1)
        # chars and time for insertion and
        # result for half of chars and time
        # for copy
        if i % 2 == 0:
            dp[i] = min(dp[i - 1] + insert,
                        dp[i // 2] + cpy)
 
        # if current char count is odd then
        # choose minimum from
        # result for (i-1) chars and time for
        # insertion and
        # result for half of chars and time for
        # copy and one extra character deletion
        else:
            dp[i] = min(dp[i - 1] + insert,
                        dp[(i + 1) // 2] +
                        cpy + remov)
 
    return dp[N]
 
# Driver Code
if __name__ == "__main__":
    N = 9
    insert = 1
    remov = 2
    cpy = 1
    print(minTimeForWritingChars(N, insert,
                                 remov, cpy))
 
# This code is contributed
# by vibhu4agarwal


C#
// C# program to write characters in
// minimum time by inserting, removing
// and copying operation
using System;
 
class GFG
{
    // method returns minimum time to write
    // 'N' characters
    static int minTimeForWritingChars(int N, int insert,
                                        int remove, int copy)
    {
        if (N == 0)
            return 0;
        if (N == 1)
            return insert;
     
        // declare dp array and initialize with zero
        int[] dp = new int[N + 1];
        for(int i = 0; i < N + 1; i++)
            dp[i] = 0;
     
          // first char will always take insertion time
          dp[1] = insert;
       
        // loop for 'N' number of times
        for (int i = 2; i <= N; i++)
        {
             
            /* if current char count is even then
                choose minimum from result for (i-1)
                chars and time for insertion and
                result for half of chars and time
                for copy */
            if (i % 2 == 0)
                dp[i] = Math.Min(dp[i - 1] + insert,
                            dp[i / 2] + copy);
     
            /* if current char count is odd then
                choose minimum from
                result for (i-1) chars and time for
                insertion and
                result for half of chars and time for
                copy and one extra character deletion*/
            else
                dp[i] = Math.Min(dp[i - 1] + insert,
                            dp[(i + 1) / 2] + copy + remove);
        }
        return dp[N];
    }
     
    // Driver code
    static void Main()
    {
        int N = 9;
        int insert = 1, remove = 2, copy = 1;
        Console.Write(minTimeForWritingChars(N, insert,
                                            remove, copy));
    }
}
 
//This code is contributed by DrRoot_


Javascript


输出

5

时间复杂度:O(N)
辅助空间: O(N)。

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程