O(mn)实现LCIS
序:
LCIS即求两序列的最长公共不下降子序列。思路于LCS基本一致。
用dp[i][j]记录当前最大值。
代码实现:
/*
About: LCIS O(mn)
Auther: kongse_qi
Date:2017/04/26
*/
#include <bits/stdc++.h>
#define maxn 505
using namespace std;
int n, m, a[maxn], b[maxn];
void Init()
{
scanf("%d%d", &n, &m);
for(unsigned i = 0; i != n; ++i)
{
scanf("%d", &a[i]);
}
for(unsigned i = 0; i != m; ++i)
{
scanf("%d", &b[i]);
}
return ;
}
int Lcis()
{
int maxx, dp[maxn][maxn], ans = 0;
for(unsigned i = 1; i != n+1; ++i)
{
maxx = 0;
for(unsigned j = 0; j != m; ++j)
{
dp[i][j] = dp[i-1][j];
if(a[i-1] > b[j])
{
maxx = max(dp[i-1][j], maxx);
}
if(a[i-1] == b[j])
{
dp[i][j] = maxx+1;
maxx = max(maxx, dp[i-1][j]);
}
}
}
for(unsigned i = 0; i != m; ++i)
{
ans = max(ans, dp[n][i]);
}
return ans;
}
int main()
{
//freopen("test.in", "r", stdin);
Init();
cout << Lcis();
return 0;
}
空间也是O(n^2),仔细阅读则会发现依然可以滚动数组,是空间复杂度降到O(n)。
与LCS的方式完全一致。
int Lcis()
{
int maxx, dp[2][maxn], ans = 0;
memset(dp, 0, sizeof dp);
for(unsigned i = 1; i != n+1; ++i)
{
maxx = 0;
for(unsigned j = 0; j != m; ++j)
{
dp[i&1][j] = dp[(i&1)^1][j];
if(a[i-1] > b[j])
{
maxx = max(dp[(i&1)^1][j], maxx);
}
if(a[i-1] == b[j])
{
dp[i&1][j] = maxx+1;
maxx = max(maxx, dp[(i&1)^1][j]);
}
}
}
for(unsigned i = 0; i != m; ++i)
{
ans = max(ans, dp[n&1][i]);
}
return ans;
}
但是这么做要注意,当你开的数组不是全局变量的时候一定要先memset为0,否则会出现一些神奇的情况。
(第一次调用的a[(i&1)^1][j]的值是系统的随机值,但是应该是0)
至此结束。
箜瑟_qi 2017.04.26
O(mn)实现LCIS的更多相关文章
- LCIS POJ 2172 Greatest Common Increasing Subsequence
题目传送门 题意:LCIS(Longest Common Increasing Subsequence) 最长公共上升子序列 分析:a[i] != b[j]: dp[i][j] = dp[i-1][j ...
- LIS && LCS && LCIS && LPS && MCS模板
1. LIS (Longest Increasing Subsequence) O (n^2): /* LIS(Longest Increasing Subsequence) 最长上升子序列 O (n ...
- 【CF10D】LCIS(LCIS)
题意:求两个序列的LCIS n,m<=300,a[i]<=1e9 题意:O(n^2) O(n^3)的话设dp[i,j]为A终点为a[1..i]且B终点为b[j]的最大长度,分a[i]==b ...
- BestCoder Round #87 1003 LCIS[序列DP]
LCIS Accepts: 109 Submissions: 775 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65 ...
- LCIS(最长公共上升子序列)Vijos1264神秘的咒语
描述 身为拜月教的高级间谍,你的任务总是逼迫你出生入死.比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底. 据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语.为了习得这些法 ...
- 最长公共上升子序列(LCIS)
最长公共上升子序列慕名而知是两个字符串a,b的最长公共递增序列,不一定非得是连续的.刚开始看到的时候想的是先用求最长公共子序列,然后再从其中找到最长递增子序列,可是仔细想一想觉得这样有点不妥,然后从网 ...
- hdu-5904 LCIS(水题)
题目链接: LCIS Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- LCIS HDOJ 4512 吉哥系列故事——完美队形I
题目传送门 题意:中文题面 分析:LCIS应用:设置b[]为a[]的反转,然后LCIS,若相等的是自己本身,则+1, 否则+2 代码: #include <cstdio> #include ...
- LIS+LCS+LCIS
PS:本篇博文均采用宏#define FOR(i, a, n) for(i = a; i <= n; ++i) LIS:最长上升子序列 废话不多说:http://baike.baidu.com/ ...
随机推荐
- RPC漏洞
DCOM漏洞:利用这个漏洞攻击者只需发送特殊形式的清求到远程计算机上的135端口,轻则会造成拒绝服务攻击,严重的甚至可以让远程攻击者以本地管理员权限执行任何操作. 攻击过程:扫描也可用xscan+DC ...
- Tcl与Design Compiler (三)——DC综合的流程
本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner 1.基本流程概述 首先 ...
- 如何使用ArcGIS发布LiDAR 点云
LiDAR--Light Detection And Ranging,即激光探测与测量技术. 下面将介绍如何使用ARCGIS来发布LiDAR的成果点云数据. LiDAR的点云数据一般格式为LAS.在A ...
- Synchronized的用法
synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码 ...
- python无线网络安全入门案例
原文链接:http://www.devx.com/security/Article/34741 翻译:诸神的黄昏 整理校对:玄魂 --- 随着⽆线⽹络在家庭和商业中的普及,新的安全挑战是⽆法避免的.保 ...
- QQ_SingleTalkClient
package test_teacher;import java.io.*;import java.net.*;public class SingleTalkClient{ public sta ...
- .Net MVC4笔记之js css引用与压缩
1.引用时,可以用即可以直接使用“~”来表示根目录. 引入js 引入js 引入css <link href="~/Content/uploadify/uploadify.css&quo ...
- 【PAT_Basic日记】1002. 写出这个数
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { void print ...
- 商城项目实战 | 1.1 Android 仿京东商城底部布局的选择效果 —— Selector 选择器的实现
前言 本文为菜鸟窝作者刘婷的连载."商城项目实战"系列来聊聊仿"京东淘宝的购物商城"如何实现. 京东商城的底部布局的选择效果看上去很复杂,其实很简单,这主要是要 ...
- 有关 json对象 取出其中数据问题
这几天,在做一个ajax异步提交的小功能,发现从ashx中传递过来的string 类型的数据,一直拿不到(当时是指的是json点不出来),傻傻的自己,一直在找其他的方法,看看其他那里出了错误,最后,那 ...