蓝桥杯2023年第十四届省赛真题-松散子序列
题目描述
给定一个仅含小写字母的字符串 s ,假设 s 的一个子序列 t 的第 i 个字符 对应了原字符串中的第 pi 个字符。我们定义 s 的一个松散子序列为:对于 i > 1 总是有 pi − pi−1 ≥ 2 。设一个子序列的价值为其包含的每个字符的价值之和 ( a ∼ z 分别为 1 ∼ 26 ) 。
求 s 的松散子序列中的最大价值。
输入格式
输入一行包含一个字符串 s 。
输出格式
输出一行包含一个整数表示答案。
样例输入
azaazaz
样例输出
78
解题思路
由于每一项的值都大于0,所以我们要尽可能多选,题目可转换为:给定一个序列,要求不能选取相邻的两个字母,问能取得的最大价值是多少。转换后就变成了我们所熟悉的打家劫舍问题,解题步骤如下:
1、分别记录每个点取货不取所形成的价值;
2、若取,就等于上一点不取的价值加上取该点的价值;
3、若不取,则记录上一点取或不取的最大价值
通过逐步迭代,寻找最优解,最终的解为最后一点取或不取的最大价值。
实现代码
def get(c):
return ord(c)-ord('a')+1 //获得字母的价值
s = input()
n = len(s)
dp = [[0,0] for i in range(n)] //定义一个二维数组,用于保存取或不取得价值
dp[0][1] = get(s[0]) //初始化,dp[i][1]代表取该字母的价值
for i in range(1,n):
dp[i][0] = max(dp[i-1][0],dp[i-1][1])
dp[i][1] = dp[i-1][0] + get(s[i])
print(max(dp[-1][0], dp[-1][1]))