Minimum time to write characters using insert, delete and copy operation

We need to write N same characters on a screen and each time we can insert a character, delete the last character and copy and paste all written characters i.e. after copy operation count of total written character will become twice. Now we are given time for insertion, deletion and copying. We need to output minimum time to write N characters on the screen using these operations.

Examples:

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

We can solve this problem using dynamic programming. We can observe a pattern after solving some examples by hand that for writing each character we have two choices either get it by inserting or get it by copying, whichever takes less time. Now writing relation accordingly,
Let dp[i] be the optimal time to write i characters on screen then,

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) 

In the case of odd, removal time is added because when (i+1)/2 characters will be copied one extra character will be on the screen which needs to be removed. Total time complexity of solution will be O(N) and auxiliary space needed will be O(N).

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to write characters in
// minimum time by inserting, removing
// and copying operation
#include <bits/stdc++.h>
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));
  
    //  loop for 'N' number of times
    for (int i = 1; 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 to test above methods
int main()
{
    int N = 9;
    int insert = 1, remove = 2, copy = 1;
    cout << minTimeForWritingChars(N, insert,
                                remove, copy);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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]; 
          
      
        // loop for 'N' number of times 
        for (int i = 1; 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 

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to write characters in
# minimum time by inserting, removing
# and copying operation
  
def minTimeForWritingChars(N, insrt, 
                           remov, cpy):
      
    # method returns minimum time 
    # to write 'N' characters 
    if N == 0:
        return 0
    if N == 1:
        return insrt
  
    # declare dp array and initialize
    # with zero
    dp = [0] * (N + 1)
  
    # loop for 'N' number of times
    for i in range(1, 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] + insrt,
                        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] + insrt, 
                        dp[(i + 1) // 2] + 
                        cpy + remov)
  
    return dp[N]
  
# Driver Code
if __name__ == "__main__":
    N = 9
    insrt = 1
    remov = 2
    cpy = 1
    print(minTimeForWritingChars(N, insrt, 
                                 remov, cpy))
  
# This code is contributed
# by vibhu4agarwal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
      
        // loop for 'N' number of times 
        for (int i = 1; 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_

chevron_right



Output:

5

This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up



Article Tags :
Practice Tags :


4


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.