最长公共递增子序列【模板】

虽然很多人说记模板提升空间有限,但是对于我这种菜鸟级别的人来说。能做的也只有记记模板了!

希望这个模板能帮到你,如果有更好的模板记得告诉我哦!!谢谢。

二维代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,a[505],b[505],dp[505][505];
int LICS()
{
	int max,i,j;
	memset(dp,0,sizeof(dp));
	for(i=1;i<=n;i++)
	{
		max=0;
		for(j=1;j<=m;j++)
		{
			dp[i][j]=dp[i-1][j];
			if(a[i]>b[j]&&max<dp[i-1][j])
				max=dp[i-1][j];
			if(a[i]==b[j])
				dp[i][j]=max+1;
		}
	}
	max=0;
	for(i=1;i<=m;i++)
	{
		if(max<dp[n][i])max=dp[n][j];
	}
	return max;
}

一维代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;  

int a[505],b[505],dp[505],n,m;  

int LICS()
{
    int i,j,MAX;
    memset(dp,0,sizeof(dp));
    for(i = 1; i<=n; i++)
    {
        MAX = 0;
        for(j = 1; j<=m; j++)
        {
            if(a[i]>b[j] && MAX<dp[j])
                MAX = dp[j];
            if(a[i]==b[j])
                dp[j] = MAX+1;
        }
    }
    MAX = 0;
    for(i = 1; i<=m; i++)
        if(MAX<dp[i])
            MAX = dp[i];
    return MAX;
}  
时间: 2024-10-25 20:24:55

最长公共递增子序列【模板】的相关文章

HDU ACM 4512 吉哥系列故事——完美队形I -&gt;LCIS最长公共递增子序列

分析:最长公共递增子序列,把数据反向存储一遍,求正反两组数据的LCIS.另外注意边界的条件判断.还有如果取出的新队列有奇数个人或偶数个人要单独判断. #include<iostream> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) int dp[202]; int a[202]; int b[202]; int LCIS(int n) { int i,j,maxlen,ans; memset(dp,0,sizeof(dp

CSU 1120 病毒(经典模板例题:最长公共递增子序列)

1120: 病毒 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 390  Solved: 153[Submit][Status][Web Board] Description 你有一个日志文件,里面记录着各种系统事件的详细信息.自然的,事件的时间戳按照严格递增顺序排列(不会有两个事件在完全相同的时刻发生). 遗憾的是,你的系统被病毒感染了,日志文件中混入了病毒生成的随机伪事件(但真实事件的相对顺序保持不变).备份的日志文件也被感染了,但由于病毒采用

模板 最长公共递增子序列

[模板]最长递增公共子序列 二维 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 6 int n,m,a[505],b[505],dp[505][505]; 7 8 int LICS() 9 { 10 int MAX,i,j; 11 memset(dp,0,sizeof(dp)); 12 for(i = 1; i<=n; i++)

CodeForces 10D. LCIS 最长公共上升子序列模板题 + 打印路径

推荐一篇炒鸡赞的blog. 下面代码中有打印路径. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <stack> #include <map> #include <

[codevs2185]最长公共上升子序列

试题描述 熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目.小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们要研究最长公共上升子序列了.小沐沐说,对于两个串A,B,如果它们都包含一段位置不一定连续的数字,且数字是严格递增的,那么称这一段数字是两个串的公共上升子串,而所有的公共上升子串中最长的就是最长公共上升子串了.奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子串.不过,只要告诉奶牛它的长度就可以了. 输入 第一行N,表示A,B的长度.第二行,串A.第三行,串B.

最长单调递增子序列的三种解法

问题描述: 找出由n个数组成的序列的最长单调递增子序列 解法一:转化成LCS问题求解,时间复杂度为O(n*n). 思路:原序列为A,把A按升序排序得到序列B,求出A,B序列的最长公共子序列,即为A的最长单调递增子序列. #include<iostream> #include<algorithm> #include<string> #include<cstdio> using namespace std; //转化成LCS问题,时间复杂度O(n*n) int

动态规划——最长公共上升子序列LCIS

问题 给定两个序列A和B,序列的子序列是指按照索引逐渐增加的顺序,从原序列中取出若干个数形成的一个子集,若子序列的数值大小是逐渐递增的则为上升子序列,若A和B取出的两个子序列A1和B1是相同的,则A1/B1为A和B的公共子序列.求出A和B的最长公共上升子序列. 分析     结合最长公共子序列和最长上升子序列来解决这个问题,定义状态dp[i][j]表示A串中前i个字符和B串中前j个字符且以B[j]为结尾的最长公共上升子序列的长度.则有状态转移方程:[在进行动态规划状态的设计的时候,要简单.详尽的

HDU 4512 最长公共上升子序列

各种序列复习: (1)最长上升子序列. 1.这个问题用动态规划就很好解决了,设dp[i]是以第i个数字结尾的上升子序列的最长长度.那么方程可以是dp[i]=max(dp[j]+1).(j<i).复杂度为O(n^2); 2.另外有一个该经典问题的O(nlogn)算法. 首先知道,当求dp[i]时,如果出现a[k]<a[j],而dp[k]=dp[j]时,应当优先选k吧.那么,既然每次选的都是较小,就可以把字符串按照dp[t]=k这个子序列长度分类.当同样dp[t]=k时,记录下该长度的最小的a[p

HDU 4512 吉哥系列故事——完美队形I(LCIS最长公共上升子序列)

http://acm.hdu.edu.cn/showproblem.php?pid=4512 题意: 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则称之为完美队形: 1.挑出的人保持他们在原队形的相对顺序不变: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然,如果m是奇数,