用魔法生成回文序列

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来做呢?回文序列并不是要求相邻两个数字满足一定条件,显然不行。

那么重新设计动规方案:

状态:

设 fi,jf_{i,j}fi,j​ 表示在区间 i,ji, ji,j 内的最长回文子序列长度。

状态转移方程:

fi,j=max{fi+1,j−1+2(当序列首尾数字可以变为相同数字时)fi,j−1fi+1,jf_{i,j}=max\begin{cases}f_{i+1,j-1}+2(当序列首尾数字可以变为相同数字时) \\ f_{i,j - 1}\\f_{i+1,j} \\ \end{cases} fi,j​=max⎩⎪⎨⎪⎧​fi+1,j−1​+2(当序列首尾数字可以变为相同数字时)fi,j−1​fi+1,j​​

阶段:

有了刚才的方程,显然每个状态依赖于起点在他之后的状态和终点在他之前的状态,那么只需要枚举从mmm 枚举到 111 作为起点i,终点 jjj 再从i+2i+2i+2 枚举到 nnn 即可。显然 :
fi,i=1f_{i,i}=1fi,i​=1。

fi,i+1f_{i,i+1}fi,i+1​当首尾数字可以变为相同数字时为2,否则为1.

好了分析就到这里了。

Code:

#include <cstdio>int father[1000005], f[1005][1005], A[1005];int getfather(int x)
{return father[x] == x ? x : father[x] = getfather(father[x]);
}//并查集int main()
{int m, n, k, a, b, ans = 1;scanf("%d%d%d", &m, &k, &n);for (int i = 1; i <= m; i ++)father[i] = i;//千万不要忘了这个初始化for (int i = 1; i <= k; i ++){scanf("%d%d", &a, &b);father[getfather(a)] = getfather(b);//数字a可以变为数字b}for (int i = 1; i <= n; i ++)scanf("%d", A + i);for (int i = 1; i <= n; i ++){f[i][i] = 1;if (getfather(A[i]) == getfather(A[i + 1]))f[i][i + 1] = 2;else f[i][i + 1] = 1;}//预处理一下,开始动规for (int i = n; i >= 1; i --)//阶段划分的顺序不要搞错for (int j = i + 2; j <= n; j ++)if (getfather(A[i]) == getfather(A[j]))//以下就是状态转移方程f[i][j] = f[i + 1][j - 1] + 2;else if (f[i + 1][j] >= f[i][j - 1])f[i][j] = f[i + 1][j];else f[i][j] = f[i][j - 1];for (int i = 1; i <= n; i ++)for (int j = i + 1; j <= n; j ++)if (f[i][j] > ans) ans = f[i][j];printf("%d", ans);return 0;//程序中最漂亮的一句话
}

NKOJ 用魔法生成回文序列相关推荐

  1. Minecraft空岛服开服

    Minecraft空岛服简介 空岛是<我的世界>中一种流行的生存模式,这种游戏模式要求你在几乎没有任何资源的情况下完成一项艰难的任务,那就是在空中方块上生存. 通过玩空岛生存,玩家能在&l ...

  2. TensorFlow 深度学习第二版:6~10

    原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译 ...

  3. 程序员面试常见海量数据处理问题

    前言 一般而言,标题含有"秒杀","99%","史上最全/最强"等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收 ...

  4. 用魔法打败魔法!这件毛衣让摄像头看不到你;两款酷炫的AI写作软件;基于深度学习扩散模型的蛋白质设计;Codon开源Python编译器;基于AI生成连贯的剧本 | ShowMeAI资讯日报

  5. string生成固定长度的哈希_Redis 选择Hash还是String 存储数据?

    点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:goodspeed 微信公众号:四月(ID:hiiiapril) 在stackov ...

  6. 刻意练习:Python基础 -- Task11. 魔法方法

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

  7. GPT2文本生成有问题?这里有些潜在解决思路

    作者 | Leo Gao 译者 | 凯隐 编辑 | 夕颜 出品 | AI科技大本营(ID: rgznai100) [导读]在过去的一年中,人们对文本生成模型的兴趣重新燃起,这在很大程度上要归功于GPT ...

  8. Python中的特殊成员和魔法方法

    1.简介 Python中有大量类似__doc__这种以双下划线开头和结尾的特殊成员及"魔法方法",它们有着非常重要的地位和作用,也是Python语言独具特色的语法之一! __ini ...

  9. 数学竟然可以这样学,用Python魔法突破数学结界!

    今年的高考刚刚过去, 在数学考完的当天,"高考数学"又一次荣登微博热搜榜榜首. 对于这场数学考试,可谓几家欢喜几家愁,图灵君浏览着微博上读者的留言深有感触. (选自微博账号@四川校 ...

最新文章

  1. BAT技术专家的4个考核点!
  2. linux分区_Linux系统 fdisk管理MBR分区
  3. 【深度学习】循环神经网络(RNN)简易教程
  4. JsonPath的使用
  5. [css] 如何用css实现把“我不爱996”变成“699爱不我”?
  6. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法
  7. python 列表推导式
  8. 走心!北京语言大学教授毕业致辞:在人生的道路上,一定要把自己当回事儿...
  9. java 重启tomcat_linux下重启tomcat的命令
  10. 普朗克黑体辐射定律python代码实现
  11. YzmCMS全新轻爽极简风格模版主题
  12. (05)FPGA内部资源
  13. vuex express mysql_基于Vue2.0+Vuex+Axios+NodeJs+Express+MySQL实现京东移动web商城
  14. php 位运算 负数,php的位运算详解
  15. Gitlab 服务器搭建,maven安装与jdk安装,linux下安装git
  16. memcached—如何在Windows操作系统中安装、启动和卸载memcached
  17. 随手记_重建的五花八门的点云地图效果(供娱乐)
  18. java 接口类型_Java-从接口类型而不是类声明
  19. 解决每次运行Xcode都需要输入密码问题
  20. 七牛:测试域名过期?自己域名又没备案?这里有一招完美解决你烦恼

热门文章

  1. 三种yum的搭建方法
  2. 【Call for papers】2023年CCF-A会议截稿日期汇总(持续更新)
  3. Antd表格性能优化
  4. 制造企业鼎新WORKFLOW ERP拓展之车间制程管理系统
  5. 数据权限的设计与实现
  6. NOVA温控器参数笔记(四)
  7. 看完你不笑证明你不是真的程序员
  8. 贪婪迭代算法(IG)
  9. STM32CubeMX系列|ADXL345传感器
  10. java系统答辩时提问的问题,管理系统答辩论文_行政管理学答辩_计算机答辩问题...