题目链接:http://bailian.openjudge.cn/practice/2757/
思路:动态规划,子问题为以ak为尾的最长长度,取ak左边小于ak的最大子序列长度加1即可,
注意,当左边没有比他小的时候,其值为1
#include <stdio.h>
#include <iostream>
using namespace std;
int a[1005],sum[1005];
int set(int k){
if(k==0){
sum[0]=1;
return 1;
}
int tmp=0;//这里的初始值必须为0,因为如果左边没有比他小的,那么其值应该为1
for(int i=0;i<k;i++){
if(a[i]<a[k]){//当左边有比他小的,那么他的值应该为左边最大的加一
if(sum[i]!=0)tmp=max(tmp,sum[i]);
else tmp=max(tmp,set(i));
}
}
sum[k]=tmp+1;
return tmp+1;
}
int main(){
int size;
cin>>size;
for(int i=0;i<size;i++){
sum[i]=0;
cin>>a[i];
}
for(int i=0;i<size;i++)
set(i);
int tmp=-1;
for(int i=0;i<size;i++){
tmp=max(tmp,sum[i]);
}
cout<<tmp<<endl;
return 0;
}