几种最基础的字符串动态规划讲

最大连续子序列和  直接扫一遍,判断当前数和(之前的累加和这个数之和)哪个大,应该是扫掉负数。


最长不下降子序列(和上个不一样,这个可以不连续)(LIS)
这个问题求的是数量,不下降的数量。因为每个状态都有2种选择,所以正常暴力的复杂度是2的阶数级,用DP转化n2。
方法:
二重循环,从头扫到这个变量。
1 6 4
dp[i] i=1 和 i=2 都是2;
存的是当前位置的最大不下降序列和。
dp[i]=max{1,dp[j]+1}  (j=1,2,....,i-1 && A[j]<A[i])
没有就是1

最长公共子序列(LCS)
求的是两个字符串最长公共部分的长度(可以不连续)
PS:子序列可以不连续,但是子串是要求连续的
if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1
else dp[i][j]=max(dp[i-1][j],dp[i][j-1])
PS:dp[i][j] 表示第一个串前i位和第二个串前j位的LCS。
如果接下来比较这位相同,那么这个dp相当于之前那个dp记录加1.
不相同的话 为这个i-1 j和 i j-1 这两个串中LCS较大那个。

最长回文字串
PS:注重这个问题的边界问题,这个边界和上面几个不太一样。
枚举子串的长度,然后一个一个长度带进去试。(这里我们从3开始)
这里dp[i][j]只有2个值,0,1,用来判断是还是不是。
if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1] //要是这个数相等,就看比它短一段的字符串是不是对称,短的是这个就对称,不然就不对称。
else dp[i][j]=0   //不相等直接等于0
边界处理:
PS:长度要从3开始,毕竟每次都减少2个。
先把长度为1的dp值全部设置成1。
然后判断长度为2的串。有的话ans=2;
前两步在一个for循环完成。
然后dp就好了。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值