我们需要在屏幕上写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 现场工作专业课程和学生竞争性编程现场课程。