题解 CF1096D Easy Problem

这篇博客介绍了如何解决 Codeforces 比赛 CF1096D 中的一个问题。博主讨论了问题的思路,使用动态规划(DP)来解决不含子序列 'hard' 的字符串删除最小代价问题,并强调了在设定边界条件时的一个常见错误。文章包含了详细的转移方程和代码实现。

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

题解 CF1096D Easy Problem

Date 2019.8.2


题目大意

给你一个长为n的字符串s以及 a1…n​,删去第i个字符的代价为 ai,你需要删去一些字符(如果一开始就符合条件当然可以不删)使得剩下的串中不含子序列 “hard”,求最小代价。

思路

因为题目要求的是不含子序列"hard",而不是子串,所以我们显然不能贪心。
而对于这种跟子序列有关的问题,我们不难想到DP。

  • 状态

    我们定义f[i][i2]为到s的第i位为止,使得其子序列只等于"hard"的前i2位的花费。其中,i为1-n,i2为1-4。

  • 转移

    分为两种情况(下文中的s数组下标从1开始,而hard数组下标从0开始

    1.s[i]=hard[i2-1]

    此时我们可以选择不花费,但会使匹配的位数增加一位;也可以花费a[i]的代价,保持匹配的位数不变。所以此时的转移方程为:
    f[i][i2]=min(f[i−1][i2−1],f[i−1][i2]+a[i])f[i][i2]=min(f[i-1][i2-1],f[i-1][i2]+a[i])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值