题目:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11313

湖师大的比赛,见我的另一篇水题题解,这里要说的是我YY出来的C题,无重复元素序列的最长公共子序列。

用常规的做法会超时,于是我YY出来一个方法,记录第一组各个数字的位置,读取第二组,把第一组出现的相同数字的位置放入序列,没出现就不放。。。然后就转成LIS题目了。。。

具体用例子来说明下,比如两个序列

3 2 1 5 4

2 1 5 4 3

很明显,LCS是2 1 5 4,4个。

那么开个初始化为-1的数组rec存放第一个序列的位置,rec[i]为数字i出现的位置,-1表示没有出现(因为不能排除第二组元素在第一组没有出现的情况)。

在这里,3出现在第1个,于是rec[3]=1,以此类推,rec[]={3,2,1,5,4}。

读取第二个序列,将第一个序列出现的相同数字的位置放到数组lis里面,没出现就不放。

在这里rec[2]=2,rec[1]=3...所以lis[]={2,3,4,5,1}。

然后用n*logn求LIS,我直接用吉大的模版。。。

求出来是4,跟答案是一样的。

int main() {
// freopen("in", "r", stdin);
int rec[maxn], lis[maxn], n, tmp;
while (scanf("%d", &n) && n) {
int cnt = 0;
memset(rec, -1, sizeof(rec));
for (int i = 1; i <= n; i++) {
scanf("%d", &tmp);
rec[tmp] = i; //存放位置
}
for (int i = 1; i <= n; i++) {
scanf("%d", &tmp);
if (rec[tmp] != -1)
lis[cnt++] = rec[tmp]; //生成LIS
}
printf("%d\n", LIS(lis, cnt));
}
return 0;
}

证明,我也不是很懂,稍微讲讲吧。。。

构造LIS时,第一个序列出现的相同数字的位置放到数组lis里面,LIS里面的升序就变成是序列一的顺序,而求最长递增子序列原本就是按序列的顺序求的,所以求出来的顺序也是序列二的顺序。

而LIS取的是两个序列相同的元素,所以求出来的子序就是原来两个序列的LCS。

额,有点牵强。。。但这是我YY出来的,挺有成就感的。。。

其实想起来和LIS的另一种求法有点像,我以前老是用的方法:

就是把原序列复制一遍并排序,然后求LCS。。。这种吃力不讨好的求法。。。

That's all...

hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明的更多相关文章

  1. 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列

    剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...

  2. [leetcode]46. Permutations全排列(给定序列无重复元素)

    Given a collection of distinct integers, return all possible permutations. Input: [1,2,3] Output: [ ...

  3. [LeetCode系列]子集枚举问题[无重复元素]

    给定一组数(未排序), 求它们的所有组合可能. 如给定{1 2 3}, 返回: [ [] [1] [2] [3] [1 2] [1 3] [2 3] [1 2 3] ] 算法思路: 对数组排序, 从小 ...

  4. 去除List<Object>集合中重复的元素(利用HashSet的特性---无重复元素)

    import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator; public class Hashset ...

  5. 合并2个数组为1个无重复元素的有序数组--Go对比Python

    Go实现: 1 package main 2 3 import ( 4 "fmt" 5 "sort" 6 ) 7 8 func main() { 9 var a ...

  6. 从无重复大数组找TOP N元素的最优解说起

    有一类面试题,既可以考察工程师算法.也可以兼顾实践应用.甚至创新思维,这些题目便是好的题目,有区分度表现为可以有一般解,也可以有最优解.最近就发现了一个这样的好题目,拿出来晒一晒. 1 题目 原文: ...

  7. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  8. python 去掉重复元素 学到再添加

    1. python 内置函数 set(可迭代对象) 返回无重复元素的集合.如在分类中,classification为类别数组 set(classification)为类别数 2.numpy np.un ...

  9. LeetCode(3):无重复字符的最长子串

    Medium! 题目描述: 给定一个字符串,找出不含有重复字符的 最长子串 的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ...

随机推荐

  1. HDU 3711 Binary Number

    Binary Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  2. Java Script 正则表达式的使用示例

    一.语法 1.1 在JS中的使用代码 var myregex = new RegExp("^[-]?[0-9][0-9]{0,2}\\.[0-9]{5,15}\\,\s*[-]?[0-9][ ...

  3. 什么是MBeanServer

    什么是MBeanServer MBeanServer是一个包含所有注册MBean的仓库.它是JMX代理层的核心.JMX1.0规范提供一个接口叫 javax.management.MBeanServer ...

  4. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  5. 【Python】Python-skier游戏[摘自.与孩子一起学编程]

    这是一个滑雪者的游戏. skier从上向下滑,途中会遇到树和旗子,捡起一个旗子得10分,碰到一颗树扣100分,可以用左右箭头控制skier方向. 准备素材 一 准备python环境:我下载的pytho ...

  6. Action 操作

    当鼠标移动到图片文件夹的时候,将有一些button显示 当鼠标移开这个文件夹,那些button隐藏了起来 display属性的变化 1.可以使用Js改变属性来操作 暂未验证,待时间. 2.可以使用Ac ...

  7. openCV学习笔记

    学习新玩意儿的事情,必须要懂人家的规矩,openCV就有自己的规范和数据结构的,要用人家的那些库函数,必须要把传入参数的基础结构搞搞明白,比如RGBA,人家opencv已经说了,用CvScalar,就 ...

  8. 问题:关于坛友的一个js轮播效果的实现

    需求:点击向前按钮进行向前翻页,向后按钮进行向后翻页,点击中间蓝色小圆圈可以来回自由切换 我的大概思路:先默认显示一个div  然后在原位置在隐藏一个div   给按钮添加click事件,转到下一个时 ...

  9. 50道经典的JAVA编程题(21-25)

    50道经典的JAVA编程题(21-25),明天早上java考试了,还是坚持做题吧...这题比老师的题好多了! [程序21]TestJieCheng.java题目:求1+2!+3!+...+20!的和1 ...

  10. hdu1150-Machine Schedule(最小点覆盖)

    二分图的最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联.     最大匹配数 = 最小点覆盖数(Konig 定理) 水题…… 突然发现我以前的匈牙利算法模版有问题……因为这里左边的点时1~n ...