说实话我觉得这个题挺奇怪的=.=
看题解都看了半天
根据动态规划的做题模板看下:
首先我们看最后一个状态:
有两种情况:1、输入A 2、输入ctrlV
设d[i]为第i次输入后 A的数量
对于最后一次输入的是A这种情况来说:d[i] = d[i-1]+1 这个比价好写
但对于最后一次输入的是ctrlv来说 ,也有两种情况:
1、ctrlA ctrlC ctrlV ctrlV ctrlV ctrlV
2、.......................ctrlA ctrlC ctrlV
我们可以用一个变量j来记录 输入完ctrlA ctrlC的位置
那么此时的A d[i] = d[j-2]*(i-j+1)
举个例子 :比如i =5 那么就让j从2开始(小于2没办法完成ctrlA ctrlv的输入)依次往后遍历,比较什么时候开始ctrlA ctrlC ctrlV 比较合适
下面就是状态转移方程
d[i] = max(d[j-2]*(i-j+1),d[i])
(就是这样的要求d[k], d[k-1]这个时候保存的是k-1位置k的最大值了,那么我先+1,假设输的是A,在从2的位置一直遍历,看是否能出现一个位置进行ctrlA ctrlC ctrlV操作后,A的是大于d[k])
代码:
class Solution:
def maxA(self, n: int) -> int:
d = [0 for _ in range(n+1)]
for i in range(1,n+1):
d[i] = d[i-1]+1
for j in range(2,n+1):
d[i] = max(d[i],(i-j+1)*d[j-2])
return d[n]