最少拦截系统 HDU - 1257
题意: 给你一个数列,问你最少有几个单调递减序列(反过来就是单调递增)。
思路: 单调递减的特点就是后面的数小于等于前面的数,那么我们只要找到一个严格单调上升数列,并统计上升数列的元素个数就行了,这些元素就是单调递减数列的第一个元素。
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); } }