题意很简单,给出一串数字,求最长的子序列,该子序列需要满足的要求是:该子序列递增。
例:
输入1 7 3 5 9 4 8
输出 4
用a[i]表示输入的字符串
这个题首先分解成子问题,子问题是以a[i]结尾的最长子字符串
所以用n[i]表示以a[i]结尾的最长公共子串.
当a[i]大于a[i-1]时,显然n[i]=n[i-1]+1;
当a[i]小于a[i-1]时,要从前面遍历,找到比a[i]小的数字里面对应的n[i]最大的那个,这样就可以与a[i]拼接成子串。
要注意的一点是,此时的n[i]是max(n[i],n[j]+1) 此处j是比a[i]小的元素。
例 1 3 2 4 5 4 3 2 1对第六个数,也就是第二个出现的4,在遍历到第二个数字3时,其对应的n[5]=4,而当继续遍历的时候,下一个元素是2,其对应的n[j]+1应该是3,但n[5]显然不是3,而是4.
代码:
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100000];
int n[100000];
int main(){
int num;
while(scanf("%d",&num)){
int i;
for(i=0;i<num;i++){
scanf("%d",&a[i]);
}
memset(n,0,sizeof(n));
for(i=0;i<num;i++){
n[i]=1;
}
int j,k;
for(i=1;i<num;i++){
for(j=0;j<i;j++){
if(a[j]<a[i]){
n[i]=max(n[i],n[j]+1);
}
}
}
cout<<*max_element(n,n+num);
}
}