题意翻译

求两个串的最长公共上升子序列。

题目描述

This problem differs from one which was on the online contest.

The sequence a1,a2,...,an  is called increasing, if ai<ai+1  for i<n  .

The sequence s1,s2,...,sk is called the subsequence of the sequence a1,a2,...,an ​ , if there exist such a set of indexes 1<=i1<i2<...<ik<=n  that aij=sj  . In other words, the sequence s s s can be derived from the sequence a a a by crossing out some elements.

You are given two sequences of integer numbers. You are to find their longest common increasing subsequence, i.e. an increasing sequence of maximum length that is the subsequence of both sequences.

输入输出格式

输入格式:

The first line contains an integer n n n ( 1<=n<=500 ) — the length of the first sequence. The second line contains n n n space-separated integers from the range [0,109] — elements of the first sequence. The third line contains an integer m m m ( 1<=m<=500) — the length of the second sequence. The fourth line contains m m m space-separated integers from the range [0,109]  — elements of the second sequence.

输出格式:

In the first line output k
— the length of the longest common increasing subsequence. In the
second line output the subsequence itself. Separate the elements with a
space. If there are several solutions, output any.

输入输出样例

输入样例#1:

7
2 3 1 6 5 4 6
4
1 3 5 6
输出样例#1:

3
3 5 6
输入样例#2:

5
1 2 0 2 1
3
1 0 1
输出样例#2:

2
0 1

Solution:

  本题线性DP。

  直接把两个常见的dp揉合,定义状态$f[i][j]$表示匹配到$A$串第$i$位并以$B$串第$j$位结尾的LCIS长度。

  那么不难得到状态转移方程:$f[i][j]=max(f[i-1][k]+1),a[i]==b[j]\&\&a[i]>b[k]$。

  显然可以滚掉第一维,然后若直接转移复杂度是$n^3$的,我们可以优化掉枚举决策$k$的循环,在状态转移完后存下最大的满足条件的$f[k]$作为下次转移的决策,显然满足最优性,这样的时间复杂度是$O(n^2)$的。

  输出方案就只需要在转移时顺带记录下$b$串每个位置的$pre$就好了。

代码:

/*Code by 520 -- 10.20*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,a[N],m,b[N],f[N],pre[N];
int stk[N],top,ans; int main(){
scanf("%d",&n); For(i,,n) scanf("%d",a+i);
scanf("%d",&m); For(i,,m) scanf("%d",b+i);
For(i,,n) {
int pos=;
For(j,,m){
if(a[i]==b[j]) f[j]=f[pos]+,pre[j]=pos;
if(a[i]>b[j]&&f[pos]<f[j]) pos=j;
}
}
int pos=;
For(i,,m) if(f[i]>f[pos]) pos=i;
printf("%d\n",f[pos]);
while(f[pos]--) stk[++top]=b[pos],pos=pre[pos];
while(top) printf("%d ",stk[top--]);
return ;
}
 
 
 
 
 
 
 
 
 
 
 
 

CF10D LCIS的更多相关文章

  1. CF10D LCIS (动态规划)

    题目链接 Solution 动态规划. 令 \(f_{i,j}\) 表示 \(a\) 数组前 \(i\) 个和 \(b\) 数组前 \(j\) 所得的最长的 LCIS . 转移很好想: \(a_i!= ...

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

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

  3. CF10D LCIS(线性DP)

    题意:\(LCIS\)输出方案 变迁の时刻,标记它 P.S:特判没\(LCIS\)的情况 //#include <iostream> #include <cstdio> #in ...

  4. CF10D/POJ2127 LCIS解题报告

    题目传送门(洛谷)(CF)(POJ) 前言 期末考试前的最后一篇题解,希望期末考  rp++ 奇怪,为什么在CF上能过的代码到POJ上就 听取WA声一片  (不管了) 题目思路 LCIS模版O(n²) ...

  5. 【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 ...

  6. 「CF10D」LCIS

    传送门 Luogu 解题思路 首先考虑怎么求方案,这样才可能会输出方案. 考虑 \(\text{DP}\). 设 \(f[i][j]\) 表示在 \(a\) 序列中选择一个 \([1...i]\) 的 ...

  7. 【二维树状数组】【CF10D】 LCIS

    传送门 Description 给你两个串,求他们的最长公共上升子序列 Input 第一行是第一个串的长度\(n\) 第二行\(n\)个数代表第一个串 第三行是第二个串的长度\(m\) 第四行\(m\ ...

  8. 【CF10D】 LCIS

    题目链接 最长公共上升子序列 \(f[i][j]\)表示\(A\)的前\(i\)个数,匹配\(B\)的第\(j\)个数,且\(B[j]\)必选时的最长公共上升子序列长度 转移: if(A[i]==B[ ...

  9. BestCoder Round #87 1003 LCIS[序列DP]

    LCIS  Accepts: 109  Submissions: 775  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: 65536/65 ...

随机推荐

  1. Splay 平衡树

    摘自大佬文章 https://www.luogu.org/blog/user19027/solution-p3369 维护一个数据结构1.插入 x 数2.删除 x 数(若有多个相同的数,因只删除一个) ...

  2. RTSP server 在mips 上莫名其妙退出(PC上则无此问题)

    http://blog.csdn.net/lubing20044793/article/details/38523701 早在这篇blog以前写过,在虚拟机下调试sn9c291时,USB 数据传输出了 ...

  3. 欢迎到我的新Blog!

    https://winniechen.cn 里面的页面还不是很好看...争取改一下! 里面的题解大部分也会在这里更新! 谢谢各位捧场!

  4. 文理分科 BZOJ3894 & happiness BZOJ2127

    分析: 最小割(一开始我没看出来...后来经过提点,大致理解...),不选则割的思想. 我们先这样考虑,将和选理相关的和S相连,与选文相关的和T相连,如果没有第二问,那么建图就是简单的S连cnt,cn ...

  5. 感言&2

    我写下这些,不是为了向谁诉说我的苦难,我家庭的苦难,而只是想说,朋友,当你们能够坐在星巴克里点杯咖啡打开Macbook刷知乎,思考“人为什么努力”这样的问题时有无数个像我一样出身的孩子在拼命,不因为什 ...

  6. 20155211 Exp5 MSF基础应用

    20155211 Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit:漏洞攻击.一个exploit程序肯定会触发系统的一个或多个 ...

  7. 20155323刘威良《网络对抗》Exp4 恶意代码分析

    20155323刘威良<网络对抗>Exp4 恶意代码分析 实践目标 1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件: ...

  8. [SHOI2012]随机树[期望dp]

    题意 初始 \(1\) 个节点,每次选定一个叶子节点并加入两个儿子直到叶子总数为 \(n\),问叶子节点深度和的平均值的期望以及最大叶子深度的期望. \(n\leq 100\) . 分析 对于第一问, ...

  9. 显示 隐藏DIV的技巧

    使用bootstrap的12分栅来演示 style="display: none;" 隐藏后释放占用的页面空间 document.getElementById("type ...

  10. 设计模式 笔记 抽象工厂模式 Abstract Factory

    //---------------------------15/04/09---------------------------- //Abstract Factory 抽象工厂----对象创建型模式 ...