最长上升子序列的回溯 ZOJ 2432
题目大意:
找一组最长上升公共子序列,并把任意一组满足的情况输出出来
最长公共上升子序列不清楚可以先看这篇文章
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的更多相关文章
- ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))
这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...
- python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)
问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...
- cf 290F. Treeland Tour 最长上升子序列 + 树的回溯 难度:1
F. Treeland Tour time limit per test 5 seconds memory limit per test 256 megabytes input standard in ...
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题
先要搞明白:最长公共子串和最长公共子序列的区别. 最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...
- LCS(Longest Common Subsequence 最长公共子序列)
最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...
- 最长公共子序列(LCS问题)
先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC.这里解决的问题就是需要一种算法可以快速的计算出这 ...
随机推荐
- P4110 [HEOI2015]小L的白日梦
传送门 题解 //minamoto #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef l ...
- 基于.Net Core的API框架的搭建(3)
5.加入缓存支持 我们希望为项目增加缓存支持,我们选择Redis做为缓存数据库. 首先,我们在Services目录增加一个缓存接口类ICacheService: using System; using ...
- 二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil
题目传送门 /* 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 每一次二分图匹配时,将点多的集合加大最后第一个集合去 注意:n <= 1,no,两 ...
- ios基础笔试题-集锦二
前言 下文转载自:http://www.henishuo.com/objc-interview-two/ 1.即时聊天App不会采用的网络传输方式 A. UDP B. TCP C. HTTP D. F ...
- LN : leetcode 207 Course Schedule
lc 207 Course Schedule 207 Course Schedule There are a total of n courses you have to take, labeled ...
- hihocoder1365 图片排版
思路: 模拟,枚举,dp. 参考了https://github.com/buptlxb/hihoCoder/blob/master/solutions/1365/picture_arrange.cpp ...
- WEB-CSS实现单行(多行)文本溢出显示省略号
//单行文本溢出部分隐藏显示省略号...overflow: hidden; text-overflow:ellipsis; white-space: nowrap; /** n 行文本溢出部分隐藏显示 ...
- 【alert(1) to win】不完全攻略
alert(1) to win 一个练习XSS的平台,地址:https://alf.nu/alert1 Warmup 给出了一段JavaScript代码 function escape(s) { re ...
- Codeforces_764_C. Timofey and a tree_(并查集)(dfs)
C. Timofey and a tree time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Android Measure 体系简单总结
Android对View的测量是半协商半强制半模糊半具体的. 测量过程中的两套尺寸体系: [半强制] ParentView**约束ChildView: **MeasureSpec(通过measure ...