蓝桥杯真题训练(一)松散子序列

 

蓝桥杯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]))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值