[CodeForces10D]LCIS(最长公共上升子序列) - DP
Description
给定两个数列,求最长公共上升子序列,并输出其中一种方案。
Input&Output
Input
第一行一个整数n(0<n<=500),数列a的长度。
第二行n个空格隔开的整数,数列a的元素。
第三行一个整数m,数据范围同n,数列b的长度。
第四行m个空格隔开的整数,意义同第二行。
Output
第一行一个整数k,LCIS的长度。
第二行k个空格隔开的整数,其中一种方案。
Solution
对于这类问题我们通常有两种转移方式,一种是以i结尾的数列,另一种是前i个数中选择一些组成的数列。
此题中我们选用a数组前i个元素,b数组以j结尾来转移,空间为O(n^2),时间为O(n^3).其实求上升的时间可以进一步优化到O(n^2logn),但本题数据不需要。
再来说方案:维护一个LICS[i][],代表以j结尾的LICS方案,每更新一次答案,则将方案也迁移过来。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 505
using namespace std;
int n,m,a[maxn],b[maxn],f[maxn][maxn],lics[maxn][maxn];
int ans,pos;
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;++i)cin>>a[i];
cin>>m;
for(int i=1;i<=m;++i)cin>>b[i];
f[0][0]=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(a[i]!=b[j])f[i][j]=f[i-1][j];
else {
f[i][j]=1;
for(int k=1;k<j;++k){
if(b[k]<b[j])
{
if(f[i-1][k]+1>f[i][j]){
f[i][j]=f[i-1][k]+1;
for(int p=1;p<=f[i-1][k];++p)lics[j][p]=lics[k][p];
}
}
}
lics[j][f[i][j]]=b[j];
}
}
for(int i=1;i<=m;++i){
if(f[n][i]>ans)ans=f[n][i],pos=i;
}
printf("%d\n",ans);
for(int i=1;i<=f[n][pos];++i)printf("%d ",lics[pos][i]);
return 0;
}
[CodeForces10D]LCIS(最长公共上升子序列) - DP的更多相关文章
- LCIS 最长公共上升子序列问题DP算法及优化
一. 知识简介 学习 LCIS 的预备知识: 动态规划基本思想, LCS, LIS 经典问题:给出有 n 个元素的数组 a[] , m 个元素的数组 b[] ,求出它们的最长上升公共子序列的长度. 例 ...
- CF10D LCIS 最长公共上升子序列
题目描述 This problem differs from one which was on the online contest. The sequence a1,a2,...,an a_{1}, ...
- LCIS最长公共上升子序列
最长公共上升子序列LCIS,如字面意思,就是在对于两个数列A和B的最长的单调递增的公共子序列. 这道题目是LCS和LIS的综合. 在LIS中,我们通过两重循环枚举当序列以当前位置为结尾时,A序列中当前 ...
- LCIS(最长公共上升子序列)Vijos1264神秘的咒语
描述 身为拜月教的高级间谍,你的任务总是逼迫你出生入死.比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底. 据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语.为了习得这些法 ...
- LCIS 最长公共上升子序列
这个博客好久没写了,这几天为了准备清华交叉研究院的夏令营,在复习大一大二ACM训练时的一些基础算法,正好碰到LICS,发现没有写在博客里,那就顺便记录一下好了. 参考链接:http://blog.cs ...
- LCIS(最长公共上升子序列)模板
求出LCIS并输出其路径. 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #inc ...
- CodeForces 10D. LCIS 最长公共上升子序列模板题 + 打印路径
推荐一篇炒鸡赞的blog. 以下代码中有打印路径. #include <algorithm> #include <iostream> #include <cstring& ...
- 【简单dp】poj 2127 Greatest Common Increasing Subsequence【最长公共上升子序列】【模板】
Sample Input 5 1 4 2 5 -12 4 -12 1 2 4 Sample Output 2 1 4 题目:给你两个数字序列,求出这两个序列的最长公共上升子序列.输出最长的长度,并打表 ...
- 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)
BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...
随机推荐
- Webpack的基本配置
一.优化项目结构,创建相关的文件,项目结构如下:src文件夹存放相关js文件,index.html项目的首页面,dist文件夹是webpack 打包 目录. index.js内容为: alert('我 ...
- 数据库MySQL、redis主从切换shell脚本
具体源码可找我领取
- StringBUffer和StringBuilder详解
一.StringBUffer public final class StringBUffer extends Object implements Serializable,CharSequnc ...
- CSS3美化网页元素
<span>标签 </span>属性名 含义 举例font-family 设置字体类型 font-family:"隶书"font-size 设置字体大小 f ...
- C# 入门经典
C#简介 使用.NETFrmework的含义 使用.NETFrmework的一个重要原因是他可以作为集成各种操作系统的方式 包含了一个非常大的代码库 除了提供这个库以外.NETFrmework还包含. ...
- 关于yaml语言
yaml语言广泛用于书写配置文件. 主要特点如下: 1.使用缩进表示层级关系,缩进使用空格键(非Tab键) 2.缩进的空格数目不要求,只要相同层级的元素左侧对其即可 3.#之后的内容为注释 4.yam ...
- Java基础学习笔记二十一 多线程
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...
- Java8学习(4)-Stream流
Stream和Collection的区别是什么 流和集合的区别是什么? 粗略地说, 集合和流之间的差异就在于什么时候进行计算.集合是一个内存中的数据结构,它包含数据结构中目前所有的值--集合中的每个元 ...
- 记录python接口自动化测试--利用unittest生成测试报告(第四目)
前面介绍了是用unittest管理测试用例,这次看看如何生成html格式的测试报告 生成html格式的测试报告需要用到 HTMLTestRunner,在网上下载了一个HTMLTestRunner.py ...
- 忘记oracle的sys密码该如何重置;附如何修改oracle数据库用户密码
参考博客:http://blog.itpub.net/26015009/viewspace-717505/ 这里只说一种方法:使用ORAPWD.EXE 工具修改密码 打开命令提示符窗口,输入如下命令: ...