最长上升子序列与最长公共子序列 C/C++

最长上升子序列:

思路:用数组b[1000]存放在i之前共有多少个上升子字符。并找出其中最长的,记录为len,遍历完0-i之后的len即为i之前最长上升子序列,因此用a[i]记录在i之前的最长上升子序列,共下一个元素参考。

在听了郭炜老师的课后,按照他的思路,把这俩题解出来,供以后回忆。

#include<stdio.h>
#include<string.h>
int a[1000];
int b[1000];
int main()
{
	int n,ans = 0;
	scanf("%d",&n);
	for(int i = 0;i < n;i++)
		scanf("%d",&a[i]),b[i] = 1;
	for(int i = 1;i < n;i++){
		int len = 0;
		for(int j = 0;j < i;j++)
			if(a[j] < a[i] && b[j] > len)	len = b[j];
		b[i]+=len;
	}
	for(int i = 0;i < n;i++)
		if(b[i] > ans)	ans = b[i];
	printf("%d",ans); 
	return 0;
} 

最长公共子序列:

代码很简单,画图很麻烦,我也不善表达,这个博主的文章想表达的和我的代码思路相同,请看点击打开链接

#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b
int main()
{
	char a[1000],b[1000];
	scanf("%s%s",a,b);
	int lenA = strlen(a),lenB = strlen(b);
	int Maxlen[100][100];
	for(int i = 0;i < lenA;i++)
		Maxlen[i][0] = 0;
	for(int j = 0;j < lenB;j++)
		Maxlen[0][j] = 0;
	for(int i = 1;i <= lenA;i++)
		for(int j = 1;j <= lenB;j++){
			if(a[i-1] == b[j-1])	Maxlen[i][j] = Maxlen[i-1][j-1]+1;
			else	Maxlen[i][j] = max(Maxlen[i-1][j],Maxlen[i][j-1]);
		}
	int len = 0;
	for(int i = 1;i <= lenA;i++)
		for(int j = 1;j <= lenB;j++)
		if(Maxlen[i][j] > len)	len = Maxlen[i][j];
	printf("%d",len);
	return 0;
}
原文地址:https://www.cnblogs.com/long98/p/10352270.html