UVA 10635 Prince and Princess—— 求LCS(最长公共子序列)转换成 求LIS(最长递增子序列)
题目大意:有n*n个方格,王子有一条走法,依次经过m个格子,公主有一种走法,依次经过n个格子(不会重复走),问他们删去一些步数后,重叠步数的最大值。
显然是一个LCS,我一看到就高高兴兴的打了个板子上去,结果TLE+RE。
仔细一看:n<=250,那么二维数组就得开250*250*250*250了,显然RE了。
所以我想着用滚动数组来存储,但是TLE又拦住了我的去路。
O(n^2)的效率就是62500*62500,大于10^8,所以1s之内完不成,所以要想别的办法。
偶然在网上找到了O(nlogn)的求LCS方法,发现正是这道题所需的:
这种方法的核心是把LCS转化成LIS求解,时间效率就可以下降到nlogn。
条件是一个数列中不能有重复项(正好与题目条件相符)。
不多说直接讲如何转化:
设两个数组是a[maxn]与b[maxn]。
在读入a的时候,将每一个a[ i ]映射到i。(map[ a [ i ] ] = i)
在读入b的时候,用b[ i ]去映射里面找有无对应的值,并新开一个数组来求LIS。(dp[ i ]=map[ b [ i ] ])
此时我们思考一下dp数组表示的含义:如果dp[ i ]==0——>b[ i ]在a[ i ]中无对应的值,当然不计算在最后结果里。
dp[ i ]!=0——>说明b[ i ]与a[ i ]中第i个数相等.
显然我们可以看出,这里a[ i ],b[ i ]都不需要,只需要用一个变量来代替就可以了,而且dp[ i ]==0的情况也不用考虑,算LIS的时候不可能带上它。
所以通过以上的步骤,我们就把LCS转化成了LIS,接下来用O(nlogn)的LIS二分优化写法求dp数组的最长上升子序列就可以了。
上代码:
#include <cstdio>
#include<algorithm>
#include <cstring>
const int maxn = 250*250+10;
int n,len1,len2,ans,aa,bb,map[maxn],dp[maxn],low[maxn];
//map数组用来建立关联(直接用map容器也ok)
//dp数组用来储存新数列,并以他为基础求LIS
int main() {
int t;
scanf("%d", &t);//多组数据
for (int kk=1;kk<=t;kk++) {
memset(low, 0, sizeof(low));
memset(map, 0, sizeof(map));
memset(dp, 0, sizeof(dp));//每次开始计算新的一组时候要初始化。
scanf("%d%d%d", &n, &len1, &len2);//题目的一个坑 ,len1,len2是走的步数,实际上走的格数是步数加1
len1 ++; len2 ++; int cnt = 1;
for (int i = 1; i <= len1; i ++) {
scanf("%d", &aa);
map[aa] = i;
}
for (int i = 1; i <= len2; i ++) {
scanf("%d", &bb);
if (map[bb]) {
dp[cnt ++] = map[bb];
}//bb如果与之前的所有aa不存在关联,不用管他,有关联再算他
}
low[1] = dp[1]; ans = 1;
for (int i = 2; i <cnt; i ++) {
if (dp[i] > low[ans]) {
low[++ ans] = dp[i];
}
else {
int yy=std::lower_bound(low+1,low+ans+1,dp[i])-low;
low[yy] = dp[i];
}
}//这是二分优化LIS
printf("Case %d: %d\n", kk, ans);//注意输出格式,\n与space
}
return 0;
}
本题的主要思路就是LCS(n^2)------->LIS(nlogn)
一种压时间复杂度的好方法。
UVA 10635 Prince and Princess—— 求LCS(最长公共子序列)转换成 求LIS(最长递增子序列)的更多相关文章
- UVA 10635 Prince and Princess【LCS 问题转换为 LIS】
题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19051 题意: 有两个长度分别为p+1和q+1的由1到n2 ...
- uva 10635 Prince and Princess(LCS成问题LIS问题O(nlogn))
标题效果:有两个长度p+1和q+1该序列.的各种元素的每个序列不是相互同.并1~n^2之间的整数.个序列的第一个元素均为1. 求出A和B的最长公共子序列长度. 分析:本题是LCS问题,可是p*q< ...
- UVA - 10635 Prince and Princess(LCS,可转化为LIS)
题意:有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n2的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 分析: A = {1,7,5,4,8,3, ...
- Uva 10635 Prince and Princess (LCS变形LIS)
直接LCS是时间复杂度是O(p*q)的,但是序列元素各不相同,只要把其中一个序列映射成有序的, 另外一个序列再做相同的映射,没有的直接删掉,就变成了求另一个序列LIS. #include<bit ...
- uva 10635 - Prince and Princess(LCS)
题目连接:10635 - Prince and Princess 题目大意:给出n, m, k,求两个长度分别为m + 1 和 k + 1且由1~n * n组成的序列的最长公共子序列长的. 解题思路: ...
- UVA - 10635 Prince and Princess LCS转LIS
题目链接: http://bak.vjudge.net/problem/UVA-10635 Prince and Princess Time Limit: 3000MS 题意 给你两个数组,求他们的最 ...
- UVA 10635 - Prince and Princess LCS转化为LIS
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- Uva 10635 - Prince and Princess LCS/LIS
两个长度分别为p+1和q+1的由1到n2之前的整数组成的序列,每个序列的元素各不相等,两个序列第一个元素均为1.求两个序列的最长公共子序列 https://uva.onlinejudge.org/in ...
- [题解]UVa 10635 Prince and Princess
讲一下题目大意,就是有两个长度为p + 1和q + 1的序列,求它们的LCS. 如果用O(pq)的算法对于这道题来说还是太慢了.所以要另外想一些方法.注意到序列中的所有元素都不相同,所以两个序列中数对 ...
随机推荐
- 购书网站前端实现(HTML+CSS+JavaScript)
购书+阅读静态网页设计与实现 一.主页设计HTML 1.效果展示及实现 2.完整代码 二.主页样式布局CSS 三.空间功能实现Javascript 主要功能 Javascript完整代码: 总结 购书 ...
- matplotlib | Python强大的作图工具,让你从此驾驭图表
今天是数据处理专题的第9篇文章,在之前的8篇文章当中我们已经介绍完了pandas这个库的一些基本用法,我们先把一些冷门的高级用法放一放,先来给大家介绍一下另外一个很有用的数据分析库--matplotl ...
- boostrap栅格系统自适应的布局
1.栅格系统 Bootstrap是基于移动优先的原则开发的,使用了一系列的媒体查询(media queries)方法,为我们的布局和界面创建自适应的的分界点.这些分界点主要是基于视口宽度的最小值, ...
- Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)
12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...
- leetcode560题解【前缀和+哈希】
leetcode560.和为K的子数组 题目链接 算法 前缀和+哈希 时间复杂度O(n). 在解决这道题前需要先清楚,一个和为k的子数组即为一对前缀和的差值. 1.我们假设有这么一个子数组[i,j]满 ...
- ISCC2018 writeup(web)
比较数字大小 F12 修改maxlength为4 web01 strcmp()函数遇到数组会返回NULL 而PHP是弱类型语言 在==比较的时候,如果有数值的话会先将字符串转换为数值在进行比较,而N ...
- Cypress系列(53)- as() 命令详解
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 作用 起别名以供以后使用 可在 cy.g ...
- mac电脑,charles,安卓手机如何配置代理,以及配置代理之后无法上网。已解决
设备: 电脑:mac book pro 手机:小米10 charles:4.5.6 方法一: 步骤: 首先确保电脑,手机在同一局域网, 1. charles设置代理:proxy -> proxy ...
- ubuntu下一键安装pptpd
1 #!/bin/bash 2 # Quick and dirty pptp VPN install script 3 # Ubuntu 12+ or Debain 7+ 4 # Reference ...
- 多线程之ReentrantLock篇(五)
昨天有说过后面讲ReentrantLock,今天我们这篇幅就全局的讲解下,我们在Lock出来前,解决并发问题没得选只能用Synchronized. 一.ReentrantLock PK synchro ...