NKOJ 用魔法生成回文序列

用魔法生成回文序列

Time Limit : 1000MS Memory Limit : 65536KB

Description

小Z上英语课思考数学问题被英语老师发现啦~

英语老师:「你这么爱胡思乱想我问你一道英语题吧」

小Z想跑,但是已经来不及了。

英语老师:「我们定义一个回文串是正反读起来相同的字符串」

小Z:「这个简单,不就是像 “abba” "aba"这样的吗」

英语老师: 「现在给你一个长度为n的字符串,要你求出他的最长回文子序列」

小Z:「子序列是不连续的吧? 好的我知道了」

小Z轻松的解决了这个问题,并把他修改了一下交给你。 现在一个字符串变成了m个数字,会魔法的小Z可以把一个数字x根据变换规则变成y,给定所有的变换规则,要你求出这个数字串的最长回文子序列。

Input Format

第一行输入3个正整数n,k和m,k是转换规则的个数。

第二行开始的k行,每行两个正整数 x和y,表示数字x可以变成数字y,并且 数字y可以变成数字x。注意,如果数字x可以变成数字y,并且数字y可以变成数字 z,那么数字x也可以便成数字z。x可能等于y,同一对(x, y)可能重复出现。

最后一行输入m个正整数,表示题目中所提的数字串,每个数≤n。

Output Format

输出一行一个数表示答案。

Sample Input
10 7 6
1 3
5 7
3 5
2 6
2 4
8 4
10 9
1 9 2 3 10 3 
Sample Output
5
题目大意:给你一个数字串,要你求出其中最长的回文子序列,其中一些数字可以互换 很明显回文子序列的左右两端必须相等,因此我们只需要判断两个数字是否能通过变化变成一样的数字即可。
Part 1

能否通过变化变成一样的数字?所以你想到了什么?反正本蒟蒻想到了并查集。

做法:每读入两个数a,b,则a可以变成b,b也可以变成a,于是我们让a所在集合的根节点的父亲等于b所在集合的根节点。

在判断的时候,只需要检查他们的根节点是否相同即可。

排除了数字互相变化的干扰,终于可以好好做题了。

Part 2

在一个序列中找到最长回文子序列,可不可以按照LIS来做呢?回文序列并不是要求相邻两个数字满足一定条件,显然不行。

那么重新设计动规方案:

状态:

f i , j f_{i,j} fi,j 表示在区间 i , j i, j i,j 内的最长回文子序列长度。

状态转移方程:

f i , j = m a x { f i + 1 , j − 1 + 2 ( 当 序 列 首 尾 数 字 可 以 变 为 相 同 数 字 时 ) f i , j − 1 f i + 1 , j

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值