- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565627 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174911
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
% D0 e# y6 p# v) S" G& G- a2 T2019第十届蓝桥杯B组决赛题解第六题
# [( P2 H# E' y" t题意:输入一个S串和一个T串,|S|>= |T|,问最少要修改S中的几个字母才能使S中有子序列T
& f7 d1 r }0 t" ^4 c+ z, m0 ]! h1 E* n% k# v
思路:dp+贪心
( a* M; B, s! X) b M. C
: ^0 v& m$ E2 b& hf[j]表示以S中第i个字母开头的串包含T中第j个字母开头的串所要修改的最少的字母数,/ X: R+ N9 g- |3 u2 f d1 i
即S中i之前的字母已经包含T中j之前所有的字母,所以分别从i和j位置继续匹配" E, O6 d' r8 I( J1 s9 D
7 l! c3 k/ C" b" a' L+ Y2 r5 N
过程简述如下:
* H; j2 j5 k) k, ^% ~, U6 HS: ABCECDFF/ x! h0 `0 n3 g$ Y
T: BBDEC: H$ L* k; L. _7 Z% P2 G" O
$ i; C9 X" T I( I y6 V开始i=1,j=1/ N1 w5 a: y) z; v& ?6 `8 B
在S开始寻找T[j]即'B',在i=2位置找到,此时我们面临两个选择,要么就让i=2和j=1匹配,要么就修改i=1的'A'为'B',因为既然修改肯定就修改最前面的
3 {5 l/ K# R2 n k假如选了前者,接下来就从i=3,j=2继续匹配,假如选了后者,就从i=2,j=2继续匹配,无论怎么选,后面面临的子问题和刚才面临的问题一模一样7 Y6 ^- f: i* C& j8 v- I
对于这个样例,选择后者总共只需要修改2个S中的字母,选择前者总共需要修改3个S中的字母% ?7 X# A% f3 \! n; j2 p
2 e# c" H0 K1 z6 W2 }本题我们需要预处理使得我们可以O(1)的查询到1位置后面最近的'B'在哪里,预处理见代码
" v; F$ f L6 R$ V. E# R还需要把f[j]记录清楚,因为有很多重复的子问题我们没有必要重复计算
7 b* p& R" r; T$ R: e' t& D1 y l W! [9 X/ O
代码:
& \2 {2 [4 T* O---------------------
3 \4 s2 ^$ E' s# u作者:nka_kun 5 c } E* L( f% M) \ c
来源:CSDN . C9 J8 L3 T6 o
/ \/ g7 @6 k! [+ @ ^: o+ ~4 _# q6 f; Y/ _2 s; a
* o& @4 c+ n7 c$ z7 t
|
zan
|