这道题其实就是求原序列能分割成最少的连续下降子序列的序列的个数
那么我们可以从序列头开始考虑,如果i<j , num[i] >num[j],那么如果将num[j]作为另一个子序列的头,那么这两个子序列能够合并成一格子序列,所以应该将num[j]追加到num[i]的子序列后,那么如果当前有多个子序列,我们肯定选择大于num[j]的最小的num[i],这样能保证付出最小的代价获得最优解,如果存在num[k]>num[j]&&num[k]]<num[i],那么num[k]作为另一个子序列的头的情况一定要要优于num[j]作为子序列的头的情况.用minn数组记录当前各个子序列的最小值,因为只有出现当前项大于所有序列的最小值的时候才会添加序列,所以minn数组能保证单调性
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 100007
using namespace std;
int minn[MAX];
int main ( )
{
int h,n;
while ( ~scanf ( "%d" , &n ) )
{
int cnt = 1;
minn[0] = 0;
for ( int i = 0 ; i < n ; i++ )
{
scanf ( "%d" , &h );
int j;
for ( j = 0 ; j < cnt ; j++ )
if ( h < minn[j] )
{
minn[j] = h;
break;
}
if ( cnt == j )
minn[cnt++] = h;
}
printf ( "%d\n" , cnt - 1 );
}
}