给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int sum;
int zuichang(int str[])
{
int i,j;
int ans[100]={0};//记录i时候的最大长度
//len=sizeof(str)/sizeof(int);
memset(ans,0,sizeof(ans));
for(i=0;str[i]!=0;i++)
{
ans[i]=1;
}
for(i=1;str[i]!=0;i++)
for(j=0;j<i;j++)
{
if(str[i]>str[j]&&ans[i]<ans[j]+1)
ans[i]=ans[j]+1;
}
sum=0;
for(i=1;ans[i]!=0;i++)
sum=max(sum,ans[i]);
return sum;
}
int main()
{
int str[100]={0};
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&str[i]);
}
//zuichang(str);
printf("%d",zuichang(str));
system("pause");
return 0;
}
另计:这个问题可以转换为最长公共子序列问题。如例子中的数组A{5,6, 7, 1, 2, 8},则我们排序该数组得到数组A‘{1, 2, 5, 6, 7, 8},然后找出数组A和A’的最长公共子序列即可。显然这里最长公共子序列为{5, 6, 7, 8},也就是原数组A最长递增子序列。