HDU 1423 最长上升公共子序列(LCIS)
题目大意:
给定两个数字数组a[] , b[],在这两个数组中找一个最长的公共上升子序列,输出最长的长度
从别人地方copy的= = LCIS理解:
(1)f[i][j] 表示 a的前i,和b串前 j,以b[j]结尾的LCIS的长度;
if(a[i]!=b[j) f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][k]+1) 1<=k<j&&b[k]<b[j];
O(n^3)的复杂度,因为多了一维k,但f[i-1][k]的最大值显然可以在处理i-1的时候求出来
for(i=1;i<=n;i++)
maxn=0;
for(j=1;j<=m;j++)
f[i][j]=f[i-1][j];
if(a[i]>b[j]&&maxn<f[i-1][j]) maxn=f[i-1][j];
if(a[i]==b[j]) f[i][j]=maxn+1;
最后扫一遍f[n][1......m] ,取最大值。
(2)压缩空间,时间不变:
用f[j]表示 所有的a[i]和b的前j个,以b[j]结尾的LCIS的长度。
注意到(1)中, if(a[i]>b[j]&&maxn<f[i-1][j]) maxn=f[i-1][j]; 我们取得其实是f[1..i-1][j]的最大值,那不就是f[j]吗?
int f[N];
int a[M],b[N];
memset(f,0,sizeof(f));
for(i=1;i<=M;i++)
maxn=0;
for(j=1;j<=N;j++)
if(a[i]>b[j]&&maxn<f[j]) maxn=f[j];
if(a[i]==b[j]) f[j]=maxn+1;
最后扫一遍f[1......N];
#include <cstdio>
#include <cstring> using namespace std;
const int N = ;
#define max(a,b) a>b?a:b
int dp[N] , a[N] , b[N];
/*可以看作是每次在第一个数据中提取一个数字,然后在第二个数组中
根据相同的数字来查找最长上升子序列,f[i][j],表示a[]前i个数据和
b数组前j个数据中能找到的以a[i]结尾的最长上升子序列的长度
但是因为下一行总是和前面所有行有关,不断更新找到前j个位置以某一个数结尾
的最大值,如果还是采用二维的,我们必须
if(a[i] == b[j])的时候,回过去建立
for(t = 1 ; t<i ; t++)
dp[i][j] = max(dp[i][j] , dp[t][k]+1);
复杂度就变成了n的3次方
这里压缩为1维数组的同时,不断更新到第j个位置所能达到的最大值
*/
void LCIS(int m , int n)
{
memset(dp , , sizeof(dp));
for(int i = ; i<=m ; i++){
/*
对于任意的f[i],f[j]来说,只要i>j,那么f[i]>f[j]的
这里k就是用来不断更新到离i最近的一个满足上升的位置
这样从离它最近的位置处进行更新这样得到的数据一定是
满足最优子结构的
比如2 , 3 , 5三个数,当把5加进来,直接用f[2]+1即可,
因为f[1]<=f[2]这是必定的,所以没必要执行f[1]+1,这样
就取消了重叠子结构的计算
*/
int k = ;
for(int j = ; j<=n ; j++){
if(a[i] == b[j]) dp[j] = max(dp[j] , dp[k] + );
//只有大于的时候才更新k,表示离它最近的满足的最长上升子序列的位置
if(a[i] > b[j] && dp[k] < dp[j]) k = j;
}
}
} int main()
{
int m , n , T;
scanf("%d" , &T);
while(T--){
scanf("%d" , &m);
for(int i = ; i<=m ; i++)
scanf("%d" , a+i); scanf("%d" , &n);
for(int i= ; i<=n ; i++)
scanf("%d" , b+i); LCIS(m , n);
int maxn = ;
for(int i = ; i <= n ; i++)
maxn = max(maxn , dp[i]); printf("%d\n" , maxn);
if(T>) puts("");
}
return ;
}
HDU 1423 最长上升公共子序列(LCIS)的更多相关文章
- hdu 1423 最长上升递增子序列
#include <iostream> #include <cstdio> #include <cstring> using namespace std; ; in ...
- 一维数组解最长上升公共子序列(LCIS)
#include<bits/stdc++.h> using namespace std; + ; int n,a[maxn],b[maxn],dp[maxn]; int main() { ...
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
- hdoj1423 最长上升公共子序列
hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对数组 ...
- 最长连续公共子序列(LCS)与最长递增公共子序列(LIS)
最长公共子序列(不连续) 实际问题中也有比较多的应用,比如,论文查重这种,就是很实际的一个使用方面. 这个应该是最常见的一种了,不再赘述,直接按照转移方程来进行: 按最普通的方式就是,直接构造二维矩阵 ...
- LCIS 最长上升公共子序列问题
首先点名一个串叫 L1,另一个叫L2. 明显的是一个DP,那么我们来探讨下如何求得答案. 朴素的算法 首先我们定义状态$dp[ i ][ j ]$表示L1中前i个与L2中前j个的最长公共上升子序列. ...
- 求最长连续公共子序列 POJ 3080
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
- 贼有意思[最长上升公共子序列](SAC大佬测试题)
题目描述Awson 最近越来越蠢了,一天就只知道 zyys.他定义了一个 zyys 数列:这个数列满足:1.是另外两个数列 A,B 的公共子序列;2.数列单调递增.现在他有一个问题,我们假设知道两个长 ...
- poj3080Blue Jeans(在m个串中找到这m个串的 最长连续公共子序列)
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
随机推荐
- bzoj 3942: [Usaco2015 Feb]Censoring【kmp+栈】
好久没写kmp都不会写了-- 开两个栈,s存当前串,c存匹配位置 用t串在栈s上匹配,栈每次入栈一个原串字符,用t串匹配一下,如果栈s末尾匹配了t则弹栈 #include<iostream> ...
- SpringCloud(Finchley版本)中Zull过滤器ResponseBoby返回中文乱码解决方案
Spring Cloud带有"Cloud"的字样,但它并不是云计算解决方案,而是在Spring Boot基础上构建的,用于快速构建分布式系统的通用模式的工具集.使用Spring C ...
- laravel 模型 $table $guarded $hidden
首先以App\User模型为例 1.$table属性 表名,对应数据库中的表名 2.guarded)属性 guarded表示在create()方法中不能被赋值的字段 3.$hidden属性 $hid ...
- redis 缓存应用
第1章 部署与安装 wget http://download.redis.io/releases/redis-3.2.10.tar.gz tar xf redis-3.2.10.tar.gz cd r ...
- SVN安装失败提示
svnserve: error while loading shared libraries: libaprutil-1.so.0: cannot open shared object file: 1 ...
- 如何快速部署Oracle Database
Oracle Database在Linux系统上的安装是每一个初学者都必须面临的问题,只有正确的配置好了环境,才能进行后续的深入学习.本文旨在说明如何快速的部署Oracle的单实例环境,对于初学者,还 ...
- 312 Burst Balloons 戳气球
现有 n 个气球按顺序排成一排,每个气球上标有一个数字,这些数字用数组 nums 表示.现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * ...
- Angular——配置模块与运行模块
配置模块 通过config方法实现对模块的配置,AngularJS中的服务大部分都对应一个“provider”,用来执行与对应服务相同的功能或对其进行配置.比如$log.$http.$location ...
- httponlycookie
cookie cookie是目前标识用户身份一项非常流行的技术:设置httponly的cookie客户端是不能通过js来修改的:你以为这样就万事大吉,没有办法伪造了吗? 背景介绍 假设网站A通过设置h ...
- RabbitMQ系列(六)--面试官问为什么要使用MQ,应该怎么回答
如果简历中有写到使用过RabbitMQ或者其他的消息中间件,可能在MQ方面的第一个问题就是问:为什么要使用MQ 面试官期望的回答 1.项目中有什么业务场景需要用到MQ 2.但是用了MQ,会带来很多问题 ...