最长上升子序列:
思路:用数组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;
}