语言表达能力欠佳。。。
思路一:依次递减序列的最小个数其实就是求最大上升子序列
思路二:正常思路:开始所有的(就是dp数组)都默认为使用系统1,a[i]>a[j](0<j<i)dp[i]=max(dp[i],dp[j]+1).
例如 4 8 100 6 3
当i遍历到第最后一个的时候,对于系统1,如果a[i]<系统1的最小高度,就会被拦截。a[i]就一定会是比系统2的最小高度要小(即是3>100),因为如果前面是2(2<3),2一定会比3先被系统1拦截
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100000
int a[maxn];
int dp[maxn];
int main()
{
int N;
while(EOF!=scanf("%d",&N))
{
int i,j;
for(i=0;i<N;i++){
scanf("%d",&a[i]);
dp[i]=1;
}
for(i=0;i<N;i++){
for(j=0;j<i;j++){
if(a[i]>a[j]){
dp[i]=max(dp[i],dp[j]+1);
}
}
}
int Max=0;
for(i=0;i<N;i++){
Max=max(dp[i],Max);
}
cout << Max << endl;
}
return 0;
}