LCS转LIS(大地的秘密题解)
2012-07-02 21:16
225 查看
求LCS(最长公共子序列)的长度的nlogn算法可以通过转换为求一个数列的LIS。与动归的n^2复杂度相比。
假如说我要求数列“1 2 3 5 4”和“5 4 3 2 1”的LCS,那么可以求第二个序列中的每个元素在第一个序列中的位置。
“5”在第一个序列的第四个位置,“4”在第五个位置,“3”在第三个位置,“2”在第二个位置,“1”在第一个位置,所以只需要对“4 5 3 2 1”这个序列求LIS的长度即可求出相应的LCS。
求LIS可以参考我先前博客的二分法算法:
具体有一道经典题目:
大地的秘密:
题目背景
在你的帮助之下,三仙兽终于弄清楚了到北京的道路,于是他们收拾一下行装,出发了。
第一站他们要经过被成为“米不亚亚亚亚尔”的神秘森林,由于有蓬絮这位走迷宫的高手打头阵,前进的道路变平坦了很多。但当他们来到这片森林的核心地带时,还是遇到了一点点小麻烦……
题目叙述
现在他们位于神秘森林的核心部位,面前有两条主要的大道,不用说,一条通向光明,一条通向黑暗。大家当然想奔向光明,远离黑暗,可是蓬絮研究了半个时辰也研究不出个所以然。
倒是细心的花楹发现了线索,她在地上搜寻时,发现了遗落在草丛里的一张纸,纸上如是写道:
致想要寻找出口的人们:
这里必须你们真正了解大地的运行规律,才能破解难关。
现在,你们只需要拿这这张纸,大喊一声:“哇呱呱呱呱呱呱呱呱呱呱~”,你们前方的地面上就会出现很多的木偶士兵,他们外貌各异。你们必须把他们排布成东边一棵松树上刻纹中写出的阵列,正确的出口才会显露出来。
正确的答案就在你们面前,只看你们能不能把握咯。
——米不亚亚亚亚尔之主:巴罗罗罗罗列吉
没办法,虽然这张破破烂烂发着臭气的纸看上去不像真的,死马当作活马医,三人还是照做了。没想到咒语刚说完,前方“嗡~”的一声起了巨大的烟雾。等到烟消云散,三兽定睛一看,地上果然出现了数不清的人偶。
他们开始相信这一张纸的真实性了,动作快的勇气赶忙找到附近的一棵松树。果然,上面也刻着数不请的人偶图案。
现在的任务就是如何调整木偶的顺序了。整个木偶群可以看成一列排布的,所有的 n 个木偶不尽相同,编号为 1-n。由于仙兽功力有限,每次施法只能把一个木偶移动到另两个木偶之间(可以移到队头和队尾)。
经过三个时辰的仔细研究,勇气已经把所有的木偶都正确编号完毕(勇气:累死俺也~她们两个都不干事的……)。现在他需要你告诉他,要完成调整最少需要移动多少次木偶,这样来给他个心里准备……
数据范围
对于 60% 的数据,n <= 1000
对于 100% 的数据,n <= 100000
第二行,n 个整数(1-n),表示初始时木偶的排布。
第三行,n 个整数(1-n),表示目标木偶的排布。
代码:
假如说我要求数列“1 2 3 5 4”和“5 4 3 2 1”的LCS,那么可以求第二个序列中的每个元素在第一个序列中的位置。
“5”在第一个序列的第四个位置,“4”在第五个位置,“3”在第三个位置,“2”在第二个位置,“1”在第一个位置,所以只需要对“4 5 3 2 1”这个序列求LIS的长度即可求出相应的LCS。
求LIS可以参考我先前博客的二分法算法:
具体有一道经典题目:
大地的秘密:
题目背景
在你的帮助之下,三仙兽终于弄清楚了到北京的道路,于是他们收拾一下行装,出发了。
第一站他们要经过被成为“米不亚亚亚亚尔”的神秘森林,由于有蓬絮这位走迷宫的高手打头阵,前进的道路变平坦了很多。但当他们来到这片森林的核心地带时,还是遇到了一点点小麻烦……
题目叙述
现在他们位于神秘森林的核心部位,面前有两条主要的大道,不用说,一条通向光明,一条通向黑暗。大家当然想奔向光明,远离黑暗,可是蓬絮研究了半个时辰也研究不出个所以然。
倒是细心的花楹发现了线索,她在地上搜寻时,发现了遗落在草丛里的一张纸,纸上如是写道:
致想要寻找出口的人们:
这里必须你们真正了解大地的运行规律,才能破解难关。
现在,你们只需要拿这这张纸,大喊一声:“哇呱呱呱呱呱呱呱呱呱呱~”,你们前方的地面上就会出现很多的木偶士兵,他们外貌各异。你们必须把他们排布成东边一棵松树上刻纹中写出的阵列,正确的出口才会显露出来。
正确的答案就在你们面前,只看你们能不能把握咯。
——米不亚亚亚亚尔之主:巴罗罗罗罗列吉
没办法,虽然这张破破烂烂发着臭气的纸看上去不像真的,死马当作活马医,三人还是照做了。没想到咒语刚说完,前方“嗡~”的一声起了巨大的烟雾。等到烟消云散,三兽定睛一看,地上果然出现了数不清的人偶。
他们开始相信这一张纸的真实性了,动作快的勇气赶忙找到附近的一棵松树。果然,上面也刻着数不请的人偶图案。
现在的任务就是如何调整木偶的顺序了。整个木偶群可以看成一列排布的,所有的 n 个木偶不尽相同,编号为 1-n。由于仙兽功力有限,每次施法只能把一个木偶移动到另两个木偶之间(可以移到队头和队尾)。
经过三个时辰的仔细研究,勇气已经把所有的木偶都正确编号完毕(勇气:累死俺也~她们两个都不干事的……)。现在他需要你告诉他,要完成调整最少需要移动多少次木偶,这样来给他个心里准备……
数据范围
对于 60% 的数据,n <= 1000
对于 100% 的数据,n <= 100000
输入格式
三行,第一行一个整数 n,表示有 n 个木偶。第二行,n 个整数(1-n),表示初始时木偶的排布。
第三行,n 个整数(1-n),表示目标木偶的排布。
输出格式
一行,一个整数,表示最少移动次数。代码:
#include <cstdlib> #include <cstdio> #include<iostream> #include<vector> using namespace std; vector<int> v1;//原始的木偶排列 vector<int> v2;//木偶编号对应的位置编号 vector<int> v3;//目标木偶排列 vector<int> v4;//目标木偶对应原始木偶排列的相对位置 vector<int> v5;//二分法求CIS的暂存序列 int n; //二分法求最长单调递增子序列关键字下标(<) int binarySearch4(int key,int lowIndex,int highIndex) { if(lowIndex==highIndex) { if(v5[lowIndex] == key) { return lowIndex; } else if(lowIndex == 0 && key<v5[0]) { return lowIndex; } return lowIndex+1; } int midIndex = (lowIndex + highIndex + 1)/2; if(key<v5[midIndex]) { return binarySearch4(key,lowIndex,midIndex-1); } else { return binarySearch4(key,midIndex,highIndex); } } int countTotal() { int lowIndex = 0; v5.push_back(v4[0]); for(int i=1;i<v4.size();i++) { lowIndex = binarySearch4(v4[i],0,v5.size()-1); if(lowIndex>v5.size()-1) { v5.push_back(v4[i]); } else { v5[lowIndex] = v4[i]; } } if(v5[v5.size()-1]==0) { return v5.size()-1; } else { return v5.size(); } } int main() { cin>>n; v1.push_back(-1); v2.push_back(-1); v3.push_back(-1); for(int i=1;i<=n;i++) { int temp; scanf("%ld",&temp); v1.push_back(temp); v2.push_back(-1); } for(int i=1;i<=n;i++) { v2[v1[i]] = i; int temp; cin>>temp; v3.push_back(temp); } for(int i=0;i<n;i++) { v4.push_back(v2[v3[i+1]]); } cout<<n-countTotal()<<endl; return 0; }
相关文章推荐
- 【LCS转LIS】大地的秘密 rqnoj242
- LCS转为LIS
- 8月3号的LCS,LIS,LICS:Longest Ordered Subsequence&&Common Subsequence&&Greatest Common Increasing Subsequence
- rqnoj-242-大地的秘密-最长上升子序列
- O(nlogn)实现LCS与LIS
- UVa 10635 王子和公主(LCS转LIS)
- 【后缀自动机】SPOJ(LCS)[Longest Common Substring]题解
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
- UVA 10635 Prince and Princess【LCS 问题转换为 LIS】
- LIS、LCS 的o(n^2) 和 o(nlogn)算法小结
- UVA 10635 Prince and Princess(LCS转LIS)
- LCS+LIS
- 【LIS 问题与 LCS 问题可以互相转换】
- Hdu 1513 & Poj 1159 (LCS) + Hdu 1025 (LIS)
- Uva 10635 Prince and Princess (LCS变形LIS)
- 洛谷P1233 木棍加工题解 LIS
- NYOJ 760 - See LCS again(LCS转LIS)
- UVA 10635 Prince and Princess【LCS 问题转换为 LIS】
- 【BZOJ】【P1109】【POI2007】【堆积木Klo】【题解】【LIS】
- LIS和LCS