在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。最长递增子序列中的元素在原序列中不一定是连续的。
输入:
4
2 3 1 5
输出:
3
代码:
#include <iostream>
#include<string.h>
using namespace std;
const int MAXN=100;
int arr[MAXN];
int memo[MAXN];//用来做备忘录,记录算过的值的最长递增子序列,降低时间复杂度
int MAX_xulie(int n){//求以n结尾时候的最长递增子序列,第一个是1 ,后面的字母如果大于前一个,就在前一个最长的序列上加1,如果小于前一个,就设为1.
if(memo[n]!=-1){
return memo[n];
}
int answer;
if(n==0){
answer= 1;
return answer;
}
answer=0;
for(int i=0;i<n;i++){
if(arr[i]<arr[n]){
answer=max(answer,MAX_xulie(i)+1);
}
}
memo[n]=answer;
return answer;
}
int main()
{int n;
while(scanf("%d",&n)!=EOF){
fill(memo,memo+n,-1);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
int answer=-1;
for(int i=0;i<n;i++){
answer=max(answer,MAX_xulie(i));
}
printf("%d\n",answer);
}
return 0;
}