HDU-1257.最少拦截系统(基础DP)

  本题大意:给出n和n个整数,让你求出其中不上升子序列的个数。

  本题思路:用dp[ i ]保存第i个防御系统攻击的最低的导弹,遍历数组,遇到更低的导弹则更新最小值,否则新加一个系统用来防御,并且更新最小值。

  参考代码:

#include <iostream>
using namespace std;

const int maxn = 1e5 + 5;
int n, ans;
int a[maxn], dp[maxn];
bool flag;

int main () {
    while(cin >> n) {
        ans = 1;
        for(int i = 0; i < n; i ++)
            cin >> a[i];
        dp[1] = a[0];//用dp[i]表示第i个下降子序列的最小元素
        for(int i = 1; i < n; i ++) {
            flag = false;
            for(int j = 1; j <= ans; j ++)
                if(a[i] <= dp[j]) {
                    dp[j] = a[i]; 
                    flag = true;
                    break;    
                }
            if(!flag) dp[++ ans] = a[i];
        }
        cout << ans << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/bianjunting/p/10584732.html