题目大意:

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

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

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. sql server数据库占用cpu太大,使用sys.dm_exec_query_stats查询优化

    查询sql语句占用 CPU详细信息: SELECT (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 , ( (CASE WHE ...

  2. Linux学习之02_Linuxd的文件权限与目录配置

    这里一些基本介绍就不介绍了,还是来介绍一下相关的命令 这一节重要的命令有这些: chgrp chown chmod 1.改变文件属性和权限 chgrp----改变文件所属用户组 chown----改变 ...

  3. 创建 pulic dblink 使不同的用户可以访问dblink

    1. system: grant create public database link to ivrsdata; 2.userdate: tnsnames.ora config db connect ...

  4. Storm概念学习系列之storm的可靠性

    这个概念,对于理解storm很有必要. 1.worker进程死掉 worker是真实存在的.可以jps查看. 正是因为有了storm的可靠性,所以storm会重新启动一个新的worker进程. 2.s ...

  5. 数据采集框架Gobblin简介

    问题导读: Gobblin的架构设计是怎样的? Gobblin拥有哪些组建,如何实现可扩展? Gobblin采集执行流程的过程? 前面我们介绍Gobblin是用来整合各种数据源的通用型ETL框架,在某 ...

  6. ES6 学习笔记 - 变量的解构赋值

    变量的解构赋值 学习资料:ECMAScript 6 入门 数组的解构赋值 基本用法 可以从数组中提取值,按照对应位置,对变量赋值.这种写法属于"模式匹配". let [a, b, ...

  7. 实例化Class类的5种方式

    Java的数据类型可以分为两类,即引用类型和原始类型.对于每种类型的对象,Java虚拟机会实例化不可变的java.lang. Class对象.它提供了在运行时检查对象属性的方法,这些属性包括它的成员和 ...

  8. DIV自动居中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 关于ORB SLAM2资源整理(持续更新)

    ORB SLAM2源码讲解(吴博) https://www.youtube.com/watch?v=2GVE7FTW7AU 泡泡机器人视频整理: http://space.bilibili.com/3 ...

  10. 【原】thinkphp修改Redis操作类,支持选择数据库功能及添加其他方法

    版本3.2.2(ThinkPHP\Library\Think\Cache\Driver\Redis.class.php), 一:官方默认不支持选择数据库功能及,现就可选择数据库功能进行说明. 1 co ...