This problem can be solved efficiently using dynamic programming. The idea is to build a table dp
where dp[i]
represents the maximum number of 'A's that can be printed with i
keystrokes.
Approach:
Base Cases:
dp[0] = 0
: No keystrokes, no 'A's.dp[1] = 1
: One keystroke, one 'A'.dp[2] = 2
: Two keystrokes, two 'A's.Recursive Relation: For i
keystrokes (where i >= 3
):
Ctrl-A
, Ctrl-C
, and Ctrl-V
.j
keystrokes to produce some number of 'A's before using Ctrl-A
, Ctrl-C
, and then Ctrl-V
repeatedly. This would require j - 1
keystrokes for 'A's, 1 keystroke for Ctrl-A
, 1 keystroke for Ctrl-C
, and the remaining (i - (j + 2))
keystrokes for Ctrl-V
operations. The number of 'A's obtained this way is dp[j - 1] * (i - j + 1)
.Iteration: We iterate through possible values of j
(from 2 to i-1
) and find the maximum value of dp[j-1] * (i-j+1)
for each i
. This maximum value represents the optimal way of using Ctrl-A
, Ctrl-C
, and Ctrl-V
for i
keystrokes and determines dp[i]
.
Result: dp[n]
contains the maximum number of 'A's achievable with n
keystrokes.
Time Complexity: O(n^2) - The nested loops iterate up to n times each.
Space Complexity: O(n) - We use a DP table of size n+1
.
class Solution:
def maxA(self, n: int) -> int:
dp = list(range(n + 1)) # Initialize dp array. dp[i] = i for base cases (i=0, 1, 2)
for i in range(3, n + 1): # Iterate for i >= 3 (more than 2 keystrokes)
for j in range(1, i): # Iterate through possible values for the number of keystrokes before ctrl operations.
dp[i] = max(dp[i], dp[j-1] * (i - j +1) if j >1 else i) # Update if a better combination is found.
return dp[n] # return the result for n keystrokes
The code directly implements the dynamic programming approach described above. The if j > 1
handles the case where we don't use Ctrl-A, Ctrl-C, and Ctrl-V (j=1).
The Java, C++, and Go solutions follow the same logic as the Python solution. The only differences are the syntax specific to each language and the method of initializing the dp
array:
iota
.The core dynamic programming logic remains consistent across all languages. The nested loops iterate through possible strategies and update the dp
array accordingly to find the maximum number of 'A's for a given number of keystrokes.