求无序整型数组中最长非降子序列的长度。
例如:数组 array[12]={8,9,1,100,2,3,4,5,1001,5,200,1000}中最长非降子序列为:1,2,3,4,5,5,200,1000。长度为8。
解法:动态规划
状态转移方程:dp[i]=1 (array[i]小于前面的所有元素时)
dp[i]=max(dp[j])+1 (0<=j<=i-1 && array[i]>=array[j])。
dp[i]中存的是以array[i]结尾的最长非降子序列的长度。
#include<iostream>
#include<string.h>
int MaxLength(int array[],int length);
int main()
{
int array[12]={8,9,1,100,2,3,4,5,1001,5,200,1000};
int maxLength=MaxLength(array,12);
std::cout<<maxLength<<std::endl;
return 0;
}
int MaxLength(int array[],int length)
{
if(array == NULL || length <= 0) return -1;
int result = 0;
int maxLen = 0;
int dp[length];
memset(dp,0,sizeof(int)*length);
dp[0] = 1;
for(int i=1;i < length;i++)
{
maxLen=0;
for(int j=i-1;j>=0;j--)
{
if(array[i]>=array[j] && dp[j]>maxLen)
{
maxLen=dp[j];
}
}
dp[i] = maxLen + 1;
if(result<dp[i])
{
result = dp[i];
}
}
return result;
}