给定一个已知数组:array[7]={1,5,9,3,4,11,5},找出最长递增子序列,返回其长度。
答案:4
即:1 5 9 11
解题思路:
给定一个与该数组长度一样的数组dp[7]={0},dp[i-1]记录以array[i]为结尾的最长递增子序列,如果array[i] > array[i-1]的话,那么dp[i]=dp[i-1]+1,否则忽略;
代码实现思路:
1 <= i < 7
对于这6个元素,分别以他们6个为结尾,然后对比他们与前一个元素的大小关系,然后进行加操作或者无操作。
每次进行比较前,都要找到前面所有项中最长的子序列长度记为_max;
然后看看本元素是不是大于之前的所有元素,如果不是就不能算作递增的,进行下一项。
#include <iostream>
#include <algorithm>
using namespace std;
int num[7]={1,5,9,3,4,11,5};
int dp[7]={0};
int process(int array[],int n)
{
//起始项赋值为1
dp[0]=1;
int _max=0;
int j=0;int k=0;
for(int i=1;i<n;i++)
{
//找到前边i-1项里最长的递增序列长度值
for(j=0;j<=i-1;j++)
{
if(_max<dp[j])
{
_max=dp[j];
}
}
int flag=1;
//确认i项是不是大于前边所有项
for(k=0;k<i-1;k++)
{
if(array[i]<array[k])
{
flag=0;
break;
}
}
if(flag)
{
dp[i]=_max+1;
}
}
int maxLen=0;
for(int i=0;i<n;i++)
{
if(maxLen<dp[i])
{
maxLen=dp[i];
}
}
return maxLen;
}
int main()
{
cout<<process(num,7)<<endl;
}