题目大意:

找一组最长上升公共子序列,并把任意一组满足的情况输出出来

最长公共上升子序列不清楚可以先看这篇文章

http://www.cnblogs.com/CSU3901130321/p/4182618.html

然后在这基础上加回溯,我自己一开始利用两个一维数组写回溯,测了很多数据都没问题

但一直给segment fault,网上也看到有人跟我一样说不知道为什么,一维数组的代码主要函数先放在这里留待以后看能否解决,或者有大神帮忙解决

 int dp[N] , a[N] , b[N] , rec[N] , fa[N] , src[N] , maxn , cnt;

 void LCIS(int m , int n)
{
memset(dp , , sizeof(dp));
memset(src , , sizeof(src));
memset(fa , , sizeof(fa));
for(int i = ; i<=m ; i++){
int k = ;
for(int j = ; j<=n ; j++){
if(a[i] == b[j]){
if(dp[j] < dp[k] + ){
dp[j] = dp[k] + ;
src[j] = i;
fa[i] = src[k];
}
}
if(a[i] > b[j] && dp[k] < dp[j]) k = j;
}
} maxn = , cnt = ;
int s;
for(int i = ; i <= n ; i++)
{
if(maxn < dp[i])
maxn = dp[i] , s = src[i];
}
rec[cnt++] = s;
while(fa[s]){
rec[cnt++] = fa[s];
s = fa[s];
}
}

后来自己改成了二维数组来回溯

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = ;
#define max(a,b) a>b?a:b
int dp[N] , a[N] , b[N] , rec[N] , maxn , cnt;
int s[N][N]; //用来回溯,记录前一次出现最大的j的位置,因为那个位置一定是会出现b[pos] = 某个a[i]的 void TraceBack(int i , int j)
{
if(i < || j < ) return ;
// cout<<"here: "<<i<<" "<<s[i][j]<<endl;
if(s[i][j] >= ){
rec[cnt++] = i; TraceBack(i- , s[i][j]);
}else TraceBack(i- , j);
} void LCIS(int m , int n)
{
memset(dp , , sizeof(dp));
memset(s , - , sizeof(s));
for(int i = ; i<=m ; i++){
int k = ;
for(int j = ; j<=n ; j++){
if(a[i] == b[j]){
if(dp[j] < dp[k] + ){
dp[j] = dp[k] + ;
s[i][j] = k;//记录上一次出现在最长子序列中能够进行匹配的j的位置
}
}
if(a[i] > b[j] && dp[k] < dp[j]) k = j;
}
} maxn = , cnt = ;
int pos ;
//我自己写的函数原因,所以必须找到第一个出现最大值的位置pos,保证在这个位置会出现某个a[i]与其匹配
/*这里从后往前找和从前往后找效果一样,但是输出的序列可能不同,
但是题目要求只输出一种情况所以也没问题,方向找,输出的正好是样例的结果
for(int i = 1 ; i<=n ; i++) 也确实AC了没问题
*/
for(int i = n ; i >= ; i--)
{
if(maxn < dp[i])
maxn = dp[i] , pos = i;
}
TraceBack(m , pos);
} 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); printf("%d\n" , maxn);
for(int i = cnt - ; i>= ; i--)
printf("%d " , a[rec[i]]);
printf("\n");
if(T>) puts("");
}
return ;
}

最长上升子序列的回溯 ZOJ 2432的更多相关文章

  1. ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))

    这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...

  2. python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)

    问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...

  3. cf 290F. Treeland Tour 最长上升子序列 + 树的回溯 难度:1

    F. Treeland Tour time limit per test 5 seconds memory limit per test 256 megabytes input standard in ...

  4. 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

    最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

  5. 用python实现最长公共子序列算法(找到所有最长公共子串)

    软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...

  6. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  7. 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题

    先要搞明白:最长公共子串和最长公共子序列的区别.    最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...

  8. LCS(Longest Common Subsequence 最长公共子序列)

    最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  9. 最长公共子序列(LCS问题)

    先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC.这里解决的问题就是需要一种算法可以快速的计算出这 ...

随机推荐

  1. 【原创】Eclipse实现图形化界面插件-vs4e

    vs4e插件下载地址:http://visualswing4eclipse.googlecode.com/files/vs4e_0.9.12.I20090527-2200.zip 下载完成后,解压,然 ...

  2. centos 安装sysbench

    安装sysbench 下载并且解压 shell> wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbe ...

  3. BFS Codeforces Beta Round #94 (Div. 2 Only) C. Statues

    题目传送门 /* BFS:三维BFS,坐标再加上步数,能走一个点当这个地方在步数内不能落到.因为雕像最多8步就会全部下落, 只要撑过这个时间就能win,否则lose */ #include <c ...

  4. TCP流量控制与拥塞解决

    滑动窗口 但要提高网络利用率: nagle算法 - 延迟 慢启动.拥塞避免 发送端主导cwnd init  set  ssthresh  &  cwnd = swnd loop : 网不阻塞 ...

  5. Storm概念学习系列之storm的定时任务

    不多说,直接上干货! 至于为什么,有storm的定时任务.这个很简单.但是,这个在工作中非常重要! 假设有如下的业务场景 这个spoult源源不断地发送数据,boilt呢会进行处理.然后呢,处理后的结 ...

  6. Ubuntu 16.04安装Kate文本编辑工具

    Kate支持很多语言,比如NASM,比SBL3低那么一点,但是比Gedit好. 安装: sudo apt-get install kate 启动: 额外配置: 1.安装Kwrite sudo apt- ...

  7. FPGA编程技巧系列之输入输出偏移约束详解

    1.   偏移约束的作用 偏移约束(Offset Constraint)用来定义一个外部时钟引脚(Pad)和数据输入输出引脚之间的时序关系,这种时序关系也被称为器件上的Pad-to-Setup或Clo ...

  8. 通过acdbblockreference 获得块名

    AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(ent.object());     AcDbObjectId pBlkTblRecId; ...

  9. 00The C Programming Language

    The C Programming Language C语言是一门面向过程.抽象化的通用程序设计语言,广泛应用于底层开发.C语言能以简易的方式编译.处理低级存储器.C语言是仅产生少量的机器语言以及不需 ...

  10. A2. JVM 类加载机制

    [概述] 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连接 ...