蓝桥杯松散子序列,模板题

本文介绍了如何将打家劫舍问题变形为松散子序列的问题,通过动态规划方法解决,给出详细步骤和代码实例,包括初始化处理和完整代码实现。
摘要由CSDN通过智能技术生成

松散子序列

用户登录icon-default.png?t=N7T8https://www.lanqiao.cn/problems/3543/learning/?page=1&first_category_id=1&sort=pass_rate&second_category_id=3&tags=%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92&asc=0

这个题目也是非常的简单啦,通过一段时间的DP训练,感觉蓝桥杯基本的DP都能做出来啦。

题目

具体内容参考上面蓝桥杯的官网链接。

解析

这个题目对我来说真的是太熟悉不过了,就是打家劫舍的变形题目。

不会这个题目的我这里提供了传送门

蓝桥杯的这个题目中的要求是

大致题目

给定一个仅含小写字母的字符串 s,假设s的一个子序列t的第个 字符对应了原字符串中的第 p;个字符。我们定义s的一个松散子序列 为:对于i>1总是有p_i - p_{i-1} \geq 2设一个子序列的价值为其包 含的每个字符的价值之和(a~z分别为1~26)。

对应到模板题——打家劫舍,不就是不能同时选中相邻的字母嘛!!!

做到这里,我们基本上就可以放心的套模板了。

浓缩成图

初始化

因为从上面的图我们可以知道,我们非常有可能会出现索引为负数的情况,所以我们需要初始化前面两个,也就是f[0]和f[1]

# 下面是伪代码
f[0] = s[0]对应的值
f[1] = max(f[0], s[1]对应的值)

完整代码

s = input()
n = len(s)
f = [0]*n
# d是用来构造一个对应列表的
d = {}
for i in range(26):
  d[chr(ord('a')+i)] = i+1

# 这里我把初始化放在里面了
# 之所以这样做是我们不能提前知道s是否长度大于1,否则直接写在外面会报错
for i in range(n):
  if i == 0:
    f[0] = d[s[0]]
  elif i==1:
    f[1] = max(f[0], d[s[1]])
  else:
    f[i] = max(f[i-2]+d[s[i]], f[i-1])
print(f[-1])

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值