十四届蓝桥杯第C题松散子序列

这篇文章介绍了使用动态规划(DP)解决编程问题的方法,具体讨论了类似LeetCode中打家劫舍和爬楼梯的题目。代码示例用Python实现,通过遍历输入数组nums,计算最大收益,其中ord(x)-96用于将字符转换为数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类似leetcode的打家劫舍和爬楼梯
一个经典的dp
nums = [i for i in input()]
n=len(nums)
f = [0]*(n + 2)
for i, x in enumerate(nums):
    f[i + 2] = max(f[i + 1], f[i] + ord(x)-96)
print(max(f[-2],f[-1]))

 

 

### 关于2023年蓝桥杯Python省赛B组松散子序列目解析 #### 目描述 在竞赛编程中,“松散子序列”的定义是指在一个给定的数组内挑选若干个不连续(即任意两个被选中的元素之间至少间隔一个未被选中的元素)的元素组成的新序列。目标是在满足上述条件的前提下使得新序列的价值总和最大。 对于特定到2023年的蓝桥杯Python省赛B组而言,虽然具体的原文字表述可能有所差异,但是核心概念与求解方法可以参照以往类似问来理解[^1]。 #### 解思路概述 此类型的问可以通过动态规划(DP)的方法高效解决。基本思想在于构建一个辅助数组`dp[]`用于记录到达每一个位置时可以获得的最大累积价值。具体实现过程中需要注意边界情况处理以及状态转移方程的设计: - 初始化阶段设置好起始条件; - 对于每个待考察的位置i,考虑两种可能性:要么跳过它继续向前;要么选择该位置上的数值并加上之前最优的选择结果(`dp[i-2]+nums[i]`); - 更新当前最佳方案至`dp[i]`中保存; - 最终遍历结束后,在整个`dp[]`表里找到全局最大的那个值作为最终答案返回。 ```python def max_loose_subsequence_sum(nums): n = len(nums) if not nums: return 0 dp = [0]*n dp[0] = nums[0] for i in range(1, n): # 如果只有一个元素,则直接取第一个元素 if i == 1: dp[i] = max(nums[0], nums[1]) else: dp[i] = max(dp[i-1], dp[i-2]+nums[i]) return dp[-1] ``` 通过这种方法能够有效地计算出符合条件的最大松散子序列之和。值得注意的是实际比赛中可能会遇到更复杂的情况比如负权值等问变种,因此建议参赛者们平时多加练习掌握更多技巧以应对各种变化形式[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值