651. 4键键盘 ----- 动态规划

说实话我觉得这个题挺奇怪的=.=

看题解都看了半天

根据动态规划的做题模板看下:

首先我们看最后一个状态:

有两种情况: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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值