松散子序列
这个题目也是非常的简单啦,通过一段时间的DP训练,感觉蓝桥杯基本的DP都能做出来啦。
题目
具体内容参考上面蓝桥杯的官网链接。
解析
这个题目对我来说真的是太熟悉不过了,就是打家劫舍的变形题目。
不会这个题目的我这里提供了传送门
蓝桥杯的这个题目中的要求是
大致题目
给定一个仅含小写字母的字符串 s,假设s的一个子序列t的第个 字符对应了原字符串中的第 p;个字符。我们定义s的一个松散子序列 为:对于i>1总是有设一个子序列的价值为其包 含的每个字符的价值之和(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])