我是按照DP 专题刷的,可这道题我应该是暴力过的
神奇之一次AC:
思路:
第一个数肯定需要一个拦截系统,后面的如果是递减下来的数值用这一个就好了,如果数变大,要看一哪个拦截系统还可以拦下,如果都不能拦下,就要加一个拦截系统

#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; int a[10005]={0},h[10005]; int sum=1; void operate(int x) { for(int i =1;i<=sum;i++) { if(x<a[i]) { a[i]=x; return ; } } sum++; a[sum]=x; return ; } int main() { int N; while(cin>>N) { sum = 0; memset(a,0,sizeof(a)); for(int i =1;i<=N;i++) { cin>>h[i]; } sum = 1;//拦截系统个数 a[1]=h[1];//第一个拦截系统的最大高度 for(int i = 2;i<=N;i++) { operate(h[i]); } cout<<sum<<endl; } return 0; }