本题大意:给出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; }