蓝桥杯-松散子序列

这篇文章介绍了如何使用Python和动态规划方法解决一个关于计算字符串中最大松散子序列价值的问题,其中子序列由不连续字符组成,且字符间至少间隔一个字符。
摘要由CSDN通过智能技术生成
"""
题目来源:
https://www.lanqiao.cn/problems/3543/learning/?page=1&first_category_id=1&name=%E6%9D%BE%E6%95%A3%E5%AD%90%E5%BA%8F%E5%88%97
"""
import os
import sys

# 返回单个字符的价值
def get_value(x):
  return ord(x) - ord('a') + 1
# 返回所有松散子序列中最大的价值
def get_maxV(s):
  n = len(s)
  if n == 0:
    return 0
  if n == 1:
    return get_value(s[0])
  
  # dp[i]表示以s中第i个字符结尾的最大松散子序列的值
  # 第i个字符可以要也可以不要, 取其最大值
  """
  第一种情况: 要第i个字符
  dp[i] = dp[i - 2] + get_value(s[i])
  第二种情况: 不要第i个字符
  dp[i] = dp[i - 1]
  取其最大的那种情况:
  dp[i] = max(dp[i - 1], dp[i - 2] + get_value(s[i]))
  """
  dp = [0] * n
  # 初始化dp
  dp[0] = get_value(s[0])
  dp[1] = max(dp[0], get_value(s[1]))
  for i, v in enumerate(s):
    if i < 2:
      continue
    dp[i] = max(dp[i - 1], dp[i - 2] + get_value(s[i]))
  return max(dp)

s = list(input())
print(get_maxV(s))
"""
这道你们可能是对松散子序列的定义感觉好难理解, 其实不要想复杂了,
松散子序列就是在原字符串中取几个不连续的字符, 且字符之间至少间隔一个字符,
在这个问题中, 我们取间隔一个字符来求解问题。
"""

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好无聊啊,烦死

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值