• 最长上升子序列与最长公共子序列 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;
    }
  • 相关阅读:
    Python __str__() 方法
    vim快捷键大全
    Python @函数装饰器及用法
    ImportError: No module named typing报错
    centos7安装pycharm2018专业版及破解
    windows下使用pycharm开发基于ansible api的python程序
    一个Windows系统下同时安装Python2和Python3
    django models def __str__(self)
    django model中的class Meta
    nmap命令详解
  • 原文地址:https://www.cnblogs.com/long98/p/10352270.html
Copyright © 2020-2023  润新知