蓝桥杯真题代码记录(松散子序列

简介: 蓝桥杯真题代码记录(松散子序列

1. 题目:

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

求 s 的松散子序列中的最大价值。

输入格式

输入一行包含一个字符串 s 。

输出格式

输出一行包含一个整数表示答案。

样例输入

azaazaz

样例输出

78

2. 我的代码:

# 输入,字符变为值
s = list(input())
num_s = [0] + [ord(i) - 96 for i in s]

# 动态规划
dp = [0] * len(num_s)
dp[1] = num_s[1]
dp[2] = num_s[2]

for i in range(3, len(num_s)):
    dp[i] = max(dp[i - 2], dp[i - 3]) + num_s[i]

print(max(dp[-1], dp[-2]))

这道题题目比较难读懂,慢慢读题,比如说:azaazaz的一个松散子序列可以是zzz,只要相隔为1个以上即可。可以仔细想一想,我们可以间隔1个,那么也可以间隔2个,那可以间隔3个吗。很明显再间隔大了就无意义了。因为间隔3个的时候正中间的数加上一定比不加上会大,所以,我们就推理得到了递推公式:dp[i] = max(dp[i - 2], dp[i - 3]) + num_s[i]

由于递推公式需要用到前面3个元素的长度,所以,初始化最开始的3个元素。并且把0索引变为0,方便递推逻辑。

最后,要得到最后结果,必须是max(dp[-1], dp[-2]),因为有可能最后一个元素不加上的时候子序列更大。

目录
相关文章
|
7月前
蓝桥杯真题代码记录(保险箱
蓝桥杯真题代码记录(保险箱
56 1
蓝桥杯真题代码记录(保险箱
|
7月前
|
网络安全 数据安全/隐私保护 计算机视觉
2024蓝桥杯网络安全-图片隐写-缺失的数据(0基础也能学会-含代码解释)
2024蓝桥杯网络安全-图片隐写-缺失的数据(0基础也能学会-含代码解释)
|
7月前
|
传感器
蓝桥杯真题代码记录(管道
蓝桥杯真题代码记录(管道
46 2
|
7月前
蓝桥杯真题代码记录(直线
蓝桥杯真题代码记录(直线
50 0
|
7月前
蓝桥杯真题代码记录(卡片
蓝桥杯真题代码记录(卡片
57 0
|
7月前
蓝桥杯真题代码记录(最优清零方案
蓝桥杯真题代码记录(最优清零方案
72 0
|
7月前
蓝桥杯真题代码记录(蜂巢
蓝桥杯真题代码记录(蜂巢
55 0
|
7月前
蓝桥杯真题代码记录(数位排序
蓝桥杯真题代码记录(数位排序
49 0
|
7月前
蓝桥杯真题代码记录(纸张尺寸
蓝桥杯真题代码记录(纸张尺寸
42 0
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
110 0