UVA 10534 LCS变种题
求一个序列中 的2*n-1个数字 ,前n+1个数字为严格升序 后n+1个为严格降序,求最长的长度
一开始还没想清楚怎么解,其实就是一个LCS问题,从头到尾以及反序求一下LCS
由于 d[i]为包含了自身的LCS,所以每次比较 min(d1[i],d2[i]),再 2*min-1即可,d1和d2分别为正序和反序的LCS。
由于时间卡的紧,要用之前学过的压栈法求LCS,时间复杂度为n*logn,中间出了一些问题,首先就是保存每个节点的LCS值的时候,如果该点是大于sta[top],那自然LCS为top+1,但是如果不是的话,我一开始写成top,原来不是,是要二分的那个位置才是。。。。还有就是二分一开始调用的是Upper_bound,错了,应该是lower_bound
再复习下 upper_bound是找大于val的第一个位置点,如果val小于整个序列,返回 0,如果val大于整个序列,返回数组的最后一位+1。
lower_bound是找大于并等于val的第一个值,如果序列中没有==val的,那跟upper是一样的效果,如果有相同的,并且同时有几个相同的,则返回第一个相同的数的下标。上界和下界是跟upper一样的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 10010
using namespace std;
int d1[N],d2[N],A[N];
int n,sta[N];
void init()
{
int top=;
sta[]=-;
sta[++top]=A[];
d1[]=;
for (int i=;i<=n;i++)
{
if (A[i]>sta[top]){
sta[++top]=A[i];
d1[i]=top;
}
else
{
int loc=lower_bound(sta+,sta+top+,A[i])-sta;
sta[loc]=A[i];
d1[i]=loc;
} }
top=;
sta[++top]=A[n];
d2[n]=;
for (int i=n-;i>=;i--)
{
if (A[i]>sta[top]){
sta[++top]=A[i];
d2[i]=top;
}
else
{
int loc=lower_bound(sta+,sta+top+,A[i])-sta;
sta[loc]=A[i];
d2[i]=loc;
} }
}
void test()
{
for (int i=;i<=n;i++)
{
printf("%d %d\n",d1[i],d2[i]);
}
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
for (int i=;i<=n;i++)
{
scanf("%d",&A[i]);
}
init();
//test();
int ans=;
for (int i=;i<=n;i++)
{
int tmp=min(d1[i],d2[i]);
ans=max(ans,*tmp-);
}
printf("%d\n",ans);
}
return ;
}
UVA 10534 LCS变种题的更多相关文章
- uva 10534 Wavio Sequence LIS
// uva 10534 Wavio Sequence // // 能够将题目转化为经典的LIS. // 从左往右LIS记作d[i],从右往左LIS记作p[i]; // 则最后当中的min(d[i], ...
- UVA 10534 三 Wavio Sequence
Wavio Sequence Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Sta ...
- UVa 489 HangmanJudge --- 水题
UVa 489 题目大意:计算机给定一个单词让你猜,你猜一个字母,若单词中存在你猜测的字母,则会显示出来,否则算出错, 你最多只能出错7次(第6次错还能继续猜,第7次错就算你失败),另注意猜一个已经猜 ...
- UVa 1585 Score --- 水题
题目大意:给出一个由O和X组成的串(长度为1-80),统计得分. 每个O的分数为目前连续出现的O的个数,例如,OOXXOXXOOO的得分为1+2+0+0+1+0+0+1+2+3 解题思路:用一个变量t ...
- LIS UVA 10534 Wavio Sequence
题目传送门 题意:找对称的,形如:123454321 子序列的最长长度 分析:LIS的nlogn的做法,首先从前扫到尾,记录每个位置的最长上升子序列,从后扫到头同理.因为是对称的,所以取较小值*2-1 ...
- hdu1159 LCS模板题
题目分析 pid=1159">原题地址 最简单的最长公共子序列(LCS)问题的模板题了.不解释. ------------------------------------------- ...
- 解题报告:hdu1159 common consequence LCS裸题
2017-09-02 17:07:42 writer:pprp 通过这个题温习了一下刚学的LCS 代码如下: /* @theme:hdu1159 @writer:pprp @begin:17:01 @ ...
- hdu 5495 LCS 水题
LCS Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5495 Descr ...
- UVA 11636-Hello World!(水题,猜结论)
UVA11636-Hello World! Time limit: 1.000 seconds When you first made the computer to print the sentenc ...
随机推荐
- 使用jquery版本的viewer.js图片更新的问题
参考博客: 使用jquery版本的viewer.js图片更新的问题 - cc_fys的博客 - CSDN博客 https://blog.csdn.net/cc_fys/article/details/ ...
- centos搭建gitlib
sudo yum install -y curl policycoreutils-python openssh-server sudo yum -y install postfixsudo syste ...
- delphi保存和提取ini文件信息
procedure TLoginForm.FormShow(Sender: TObject);var ini:TIniFile; name:string;begin //实现动态提取数据库的登录用户名 ...
- poj 1027 Ignatius and the Princess II全排列
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- Rails 第一课:环境配置 Ruby Rails RVM Heroku
安装 上传专案到 Heroku 安装 Ruby 2.3.1 Rails 5.0.0.1 RVM 1.27.0 比较幸运一个问题都未碰到 MacOS 10.12.1 配置完成系统顺利升级到10.12.2 ...
- arduino中的serial .available()和serial.read()
Serial.available() 的意思是:返回串口缓冲区中当前剩余的字符个数.一般用这个函数来判断串口的缓冲区有无数据,当Serial.available()>0时,说明串口接收到了数据, ...
- 【LeetCode】最小栈
[问题] 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈 ...
- 【STM32H7教程】第51章 STM32H7的LTDC应用之LCD汉字显示和2D图形显示
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第51章 STM32H7的LTDC应用之LCD汉字 ...
- 022-PHP数组排序asort
<?php // 构造一个数组变量 $users = array("bob" => "Yobert", "steve" => ...
- opencv+python实时人脸检测、磨皮
import numpy as np import cv2 cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier("d ...