版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/qq574857122/article/details/34430283

题目链接:点击打开链接

题意:

给定n长的一个序列

再给定k长的一个序列

求LCIS并输出这个子序列

如有多解输出随意解。。

= - = 敲的时候听着小曲儿pre的含义还没有想清楚。万万没想到就过了。。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
#include<vector>
#include<map>
#include<math.h>
#include<string>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 505
int a[N],s[N];
int n, k;
int dp[N][N];
int pre[N][N][2];
int is[N][N];
vector<int>G;
int main(){
int i,j,co;
while(~scanf("%d",&n)){
G.clear();
for(i=1;i<=n;i++)scanf("%d",&a[i]);
scanf("%d",&k);
for(i=1;i<=k;i++)scanf("%d",&s[i]);
memset(dp, 0, sizeof dp);
memset(pre, 0, sizeof pre);
memset(is, 0, sizeof is);
for(i=1;i<=n;i++) {
int maxx = 0;
int x = 0, y = 0;
for(j=1;j<=k;j++)
{
dp[i][j] = dp[i-1][j];
if(a[i]>s[j] && maxx < dp[i-1][j]) {
maxx = dp[i-1][j];
if(is[i-1][j])
x = i-1, y = j;
else {
x = pre[i-1][j][0];
y = pre[i-1][j][1];
}
}
if(a[i]==s[j]) {
is[i][j] = 1;
dp[i][j] = maxx + 1;
if(is[x][y])
pre[i][j][0] = x, pre[i][j][1] = y;
else {
pre[i][j][0] = pre[x][y][0];
pre[i][j][1] = pre[x][y][1];
}
continue;
}
if(is[i-1][j])
pre[i][j][0] = i-1, pre[i][j][1] = j;
else {
pre[i][j][0] = pre[i-1][j][0];
pre[i][j][1] = pre[i-1][j][1];
}
}
}
int ans = 0;
int x = n, y = k;
for(i=1;i<=k;i++)if(ans<dp[n][i]){
ans = dp[n][i];
x = n, y = i;
}
printf("%d\n",ans);
if(!ans)continue;
while(x+y) {
if(is[x][y])G.push_back(a[x]);
int x1 = pre[x][y][0];
int y1 = pre[x][y][1];
x = x1 , y = y1;
}
for(i=G.size()-1; i>=0; i--){
printf("%d",G[i]);
i? printf(" "):puts("");
}
}
return 0;
}
/*
2
1 2
3
1 2 3 */

Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp的更多相关文章

  1. 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message

    Language: Default Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 21 ...

  2. [algorithm]求最长公共子序列问题

    最直白方法:时间复杂度是O(n3), 空间复杂度是常数 reference:http://blog.csdn.net/monkeyandy/article/details/7957263 /** ** ...

  3. poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403

    题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...

  4. POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解

    题意:求最长公共子串 思路:把两个串Hash,然后我们把短的作为LCS的最大可能值,然后二分长度,每次判断这样二分可不可以.判断时,先拿出第一个母串所有len长的子串,排序,然后枚举第二个母串len长 ...

  5. 算法 -- 求最长公共字符串&PHP

    https://blog.csdn.net/hongyuancao/article/details/83308093 本文是利用PHP,求最长公共字符串.思路:利用动态规划和矩阵的思想. 动态规划:就 ...

  6. HDU 4681 string 求最长公共子序列的简单DP+暴力枚举

    先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...

  7. 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】

    算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...

  8. 求最长公共子串 Longest Common Subsequence

    最长公共子串 // Longest Common Subsequence 子串有别于子序列, 子串是连续的, 而子序列可以不连续 /*--------------------------------- ...

  9. 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树

    腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...

随机推荐

  1. Max Sum Plus Plus(最大m字段和,优化)

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Now I t ...

  2. 客户端框架-MVVM

    MVVM Model-View-ViewModel 如果说MVP是对MVC的进一步改进,那么MVVM则是思想的完全变革.它是将"数据模型数据双向绑定"的思想作为核心,因此在View ...

  3. Java并发编程的艺术笔记(八)——线程池

    一.线程池的主要处理流程 ThreadPoolExecutor执行execute方法分下面4种情况. 1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步需要获 ...

  4. [翻译]扩展C#中的异步方法

    翻译自一篇博文,原文:Extending the async methods in C# 异步系列 剖析C#中的异步方法 扩展C#中的异步方法 C#中异步方法的性能特点. 用一个用户场景来掌握它们 在 ...

  5. 用过消息队列?Kafka?能否手写一个消息队列?懵

    是否有同样的经历?面试官问你做过啥项目,我一顿胡侃,项目利用到了消息队列,kafka,rocketMQ等等. 好的,那请开始你的表演,面试官递过一支笔:给我手写一个消息队列!!WHAT? 为了大家遇到 ...

  6. Python学习笔记:第一次接触

    用的是windows的IDLE(python 3) 对象的认识:先创建一个list对象(用方括号) a = ['xieziyang','chenmanru'] a 对list中对象的引用 a[0] # ...

  7. du和df目录大小不一致

    最近遇到个问题 df查看基本没有空间了 但是查找大文件 也基本没有 ,原来是之前的大文件删除了 没有生效导致的 用如下命令,查找到相关进程ID 然后kill就行了 lsof | grep delete ...

  8. 服务器被攻击后当作矿机,高WIO

    __ 矿机特点:    操作系统反应慢. wio 非常高,一般轻松达到50%,甚至达到100%. 在/root/ 下存在 .ddg 隐藏路径.路径中有nnnn.db 二进制文件. /tmp ./usr ...

  9. 代码实现:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.第二个完全数是28, //它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加, //编程找出1000以内的所有完数。

    import java.util.ArrayList; import java.util.List; //一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3. ...

  10. python 实验2 分支结构

    该博客专为我的小伙伴们提供参考而附加,没空加上代码具体解析,望各位谅解 实验一   货币转换   ‪‪‪‪‪‫‪‪‪‪‪写一个程序进行人民币和欧元间币值转换,其中:‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫ ...