题意:
给你一个数列,问你最少有几个单调递减序列(反过来就是单调递增)。
思路:
单调递减的特点就是后面的数小于等于前面的数,那么我们只要找到一个严格单调上升数列,并统计上升数列的元素个数就行了,这些元素就是单调递减数列的第一个元素。
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], dp[maxn];
void init(int n){
for(int i = 0; i <= n; i++) dp[i] = 0;
}
int main(){
int n;
while(~scanf("%d", &n)){
init(n);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
if(a[j] > a[i]) dp[j] = max(dp[j], dp[i] + 1);
int ans = 0;
for(int i = 0;i < n; i++) ans = max(ans, dp[i]);
printf("%d\n", ans + 1);
}
}