【算法心得】一维dp状态转移狂练

一维dp只代表数组是一维的,不代表只有一层for循环

最长不下降子序列LIS

建表

最长不下降子序列

dp[i]是指从1~i的最长不下降子序列长度

但是算dp[i],只知道dp[i-1]还不够

需要知道的是s[i]接在s[1]到s[i-1]后面所有的情况
在这些情况中取最大值,也就是需要知道dp[1]到dp[i-1]

这里就有一些问题:
如果按照之前的定义,dp[x]可能不包含x,这就没有办法作为之后的状态转移的依据;换言之,s[i]不是LIS中最大的那个值,就没法比较

所以添加一个限制:dp[i]必须包含x,s[i]是LIS中最大的那个值

填dp[0]

最长不下降子序列

0

填dp[i]

最长不下降子序列

全0
注意,这个dp[i][j]是一定要包含s[i]的,所以只有两种情况:

  1. 可以接在s[j]之后,dp[j]+1;
  2. 不可以接在s[j]之后。因为有dp[i]必须包含i的限制,所以只能是1,只包含一个s[i]的序列

dp[i][j] = s[i]>=s[j] ? dp[j]+1 : 1

dp[i] = max(dp[i][j]) 1<=j<=i-1

矫正

注意下标,i的有效值从1到n,对应数组元素的0到n-1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值