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的更多相关文章

  1. LCIS 最长公共上升子序列问题DP算法及优化

    一. 知识简介 学习 LCIS 的预备知识: 动态规划基本思想, LCS, LIS 经典问题:给出有 n 个元素的数组 a[] , m 个元素的数组 b[] ,求出它们的最长上升公共子序列的长度. 例 ...

  2. CF10D LCIS 最长公共上升子序列

    题目描述 This problem differs from one which was on the online contest. The sequence a1,a2,...,an a_{1}, ...

  3. LCIS最长公共上升子序列

    最长公共上升子序列LCIS,如字面意思,就是在对于两个数列A和B的最长的单调递增的公共子序列. 这道题目是LCS和LIS的综合. 在LIS中,我们通过两重循环枚举当序列以当前位置为结尾时,A序列中当前 ...

  4. LCIS(最长公共上升子序列)Vijos1264神秘的咒语

    描述 身为拜月教的高级间谍,你的任务总是逼迫你出生入死.比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底. 据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语.为了习得这些法 ...

  5. LCIS 最长公共上升子序列

    这个博客好久没写了,这几天为了准备清华交叉研究院的夏令营,在复习大一大二ACM训练时的一些基础算法,正好碰到LICS,发现没有写在博客里,那就顺便记录一下好了. 参考链接:http://blog.cs ...

  6. LCIS(最长公共上升子序列)模板

    求出LCIS并输出其路径. 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #inc ...

  7. CodeForces 10D. LCIS 最长公共上升子序列模板题 + 打印路径

    推荐一篇炒鸡赞的blog. 以下代码中有打印路径. #include <algorithm> #include <iostream> #include <cstring& ...

  8. 【简单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 题目:给你两个数字序列,求出这两个序列的最长公共上升子序列.输出最长的长度,并打表 ...

  9. 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)

    BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...

随机推荐

  1. Mycat 分片规则详解--自然月分片

    实现方式:按照月份列分片,每个自然月一个分片 优点:使数据按照每月来进行分时存储 缺点:由于数据是连续的,所以该方案不能有效的利用资源 配置示例: <tableRule name="s ...

  2. Angular组件——中间人模式

    设计一个组件时,组件应该是内聚的,应该不依赖外部已经存在的组件,要实现这种松耦合的组件要使用中间人模式. 一.中间人模式 该组件树中除了组件1以外,每个组件都有一个父组件可以扮演中间人的角色.顶级的中 ...

  3. 使用Mifare卡加密数据 笔记

    Mifare 是最常用的射频卡,具体介绍网上太多,我就不说了.,很多城市的最早的地铁公交卡都是用这种卡,后来被破解后都换成智能卡了. 但是由于技术成熟,使用方便,成本低,现在很多小区门禁卡,停车卡,食 ...

  4. 记录一则ASM实例阻塞,rbal进程异常的案例

    1.故障现象描述 2.确认故障现象 3.排查ASM层面 4.解决问题 1.故障现象描述 环境:AIX 7.1 + Standalone Oracle 11.2.0.4 现象:客户反映某11g版本的AD ...

  5. k8s实战为aspnetcore.webapi微服务注入配置信息 - kubernetes

    1.浅析k8s配置信息 Secret 以密文的形式存储数据,可以用来保存一些敏感信息,例如:OAuth tokens.私钥.密码.数据库连接.事件总线连接等. ConfigMap 以明文的形式存储数据 ...

  6. Java多线程:队列与阻塞队列

    1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...

  7. echarts词云引用

    最近项目中需要使用echarts的词云图,因为几经波折才引用成功,所以想记下来跟大家分享,(我的随笔不会写那么多让人需要动脑子去理解的东西,就是记录一下步骤,因为经验甚少,底层原理懂得不多,所以就先记 ...

  8. setContentView()与LayoutInflater.inflate()作用

    @Override protected void onCreate(Bundle savedInstanceState) {  try{   super.onCreate(savedInstanceS ...

  9. linux系统无法正常启动,故障排查恢复

    linux内核启动修复 首先看linux内核重要文件grub.conf # grub.conf generated by anaconda # # Note that you do not have ...

  10. ibatis.net 入门demo 实现基本增删改查

    1.项目架构体系  DAO(数据访问层)   Domain(实体层)  Text(表示层) 2.比较重要的是需要添加两个dll的引用,以及两个配置文件和一个XML文件 两个 IbatisNet.Com ...