https://vjudge.net/problem/HDU-1257
    最少拦截系统

    1. //二分做法
    2. #include <cmath>
    3. #include <cstdio>
    4. #include <iostream>
    5. #include <algorithm>
    6. #include <queue>
    7. #include <map>
    8. #include <cstring>
    9. #include <vector>
    10. #include <stack>
    11. #include <string>
    12. using namespace std;
    13. #define ll long long
    14. #define ff first
    15. #define ss second
    16. #define mp make_pair
    17. #define ph push
    18. #define pb push_back
    19. #define all(x) (x).begin(), (x).end()
    20. typedef pair<int, int> pii;
    21. const int N = 3e4 + 5;
    22. const int INF = 1e9 + 5;
    23. priority_queue<int, vector<int>, greater<int> > pq;
    24. int dp[N], a[N];
    25. int main() {
    26. ios::sync_with_stdio(false);
    27. int n;
    28. while (cin >> n) {
    29. memset(a, 0, sizeof(a));
    30. for (int i = 0; i < N; i++) {
    31. dp[i] = INF;
    32. }
    33. for (int i = 1; i <= n; ++i) {
    34. cin >> a[i];
    35. }
    36. for (int i = 1; i <= n; i++) {
    37. *lower_bound(dp, dp + n, a[i]) = a[i];
    38. }
    39. cout << (lower_bound(dp, dp + n, INF) - dp) << endl;
    40. }
    41. return 0;
    42. }

    1. //dp入门
    2. #include <cmath>
    3. #include <cstdio>
    4. #include <iostream>
    5. #include <algorithm>
    6. #include <queue>
    7. #include <map>
    8. #include <cstring>
    9. #include <vector>
    10. #include <stack>
    11. #include <string>
    12. using namespace std;
    13. #define ll long long
    14. #define ff first
    15. #define ss second
    16. #define mp make_pair
    17. #define ph push
    18. #define pb push_back
    19. #define all(x) (x).begin(), (x).end()
    20. typedef pair<int, int> pii;
    21. const int N = 3e4 + 5;
    22. const int INF = 1e9 + 5;
    23. priority_queue<int, vector<int>, greater<int> > pq;
    24. int dp[N], a[N];
    25. int main() {
    26. ios::sync_with_stdio(false);
    27. int n;
    28. while (cin >> n) {
    29. int sum=-1;
    30. memset(a, 0, sizeof(a));
    31. for (int i = 1; i <= n; ++i) {
    32. cin >> a[i];
    33. }
    34. for (int i = 1; i <= n; i++) {
    35. //记得初始化,如果有必要
    36. dp[i]=1;
    37. for(int j=1;j<i;j++){
    38. if(a[j]<a[i]){
    39. //dp[j] 是前面的状态
    40. dp[i]=max(dp[j]+1,dp[i]);
    41. }
    42. }
    43. sum=max(sum,dp[i]);
    44. }
    45. cout << sum << endl;
    46. }
    47. return 0;
    48. }