【GDOI 2017 day2】小学生语文题

58 篇文章 0 订阅

Description

给你一个A串一个B串,长度都为N
A固定,B中的字符可以且仅可以从后往前拖
求最小拖动次数,使得B串与A串相等,并输出每一步的拖动方案
保证有解
N<=2000
10组数据,一秒时限
GDOI2017day2T3

Analysis

这种题强烈感觉像DP,但是比赛的时候想不到
这种智商题非常好,尤其喜欢这道题的idea,模型经典而有变化,码量小而有思维含量
考虑最小拖动次数,是不是等于N-LCS的长度?
很像但不完全是!如果能随便拖动就是了,但是这题只能从后往前拖
考虑LCS的本质,是相等的字符进行匹配
那么这题,是不是也是一种有奇怪规则的匹配呢
对的。
这里写图片描述
乱死了
形如“/”的匹配所形成的最长子序列 是不用拖动的(从相对位置的角度想)
也就是说,两条形如“/”的匹配是不能相交的,不然也要拖动
所以我们要最大化合法匹配数,这个用DP做
那么所有的匹配就被我们分成了两种,合法的(计入答案),不合法的
从左到右做
f[i][j] 表示A到了i,B到了j,其前面的都已经确定好匹配(具体位置可能不清楚,但是不影响答案计算)
首先由于匹配只能形如“/”,所以必须保证 i>=j
并且我们需从头开始一位位确定,前面的确定好了才能更新后面的
至于为什么,看看上面那个图。如果你确定了后面的匹配并认为其合法,计入答案。但是没确定前面的匹配。前面的匹配之后又使得后面某些匹配变得不合法了
N<=2000提示我们转移只能是O(1)的
考虑三种情况
1.转移到 f[i+1][j+1] ,当且仅当 a[i+1]=b[j+1] ,合法匹配数+1

2.转移到 f[i+1][j] ,合法匹配数不变。
这表示的含义是 a[i+1] 与B中j后的一个位置进行了匹配。也就是说,将 a[i+1] 放弃,等到以后某个b中的位置和它相等了再进行不合法匹配

3.转移到 f[i][j+1] ,合法匹配数不变。
类似地,表示将 b[j+1] 放弃合法匹配,而是跟以前的某个a中没能进行合法匹配的位置去匹配
然而这个转移就要有条件了。并不是想放弃就能放弃的,前提是A中有能和它进行不合法匹配的位置
如何判定这个?这并不难,请读者自行思考。提示:在两个串中,分别记录每个位置到尾端,该字符的出现次数

然后我们就能够DP出最少次数了!
求具体方案的话记录一下DP的转移,模拟回去就好了,并不困难

Summary

回过头总结这道题,难点在于DP
知识点基础,但是能放在T3的位置
正解是DP并不难想,关键是一些性质的挖掘
这种题要有自信,就是正解肯定是DP
思考的过程中很可能会有地方遗漏,很难一次性想全
所以比赛的时候做这种题,要打好暴力和对拍,通过对拍找出自己考虑遗漏的地方
因为正解确定了嘛,所以一些情况进行修补也不会是大改吧
以上纯属口胡,如有错….欢迎来打脸=w=

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值