题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257
dp数组记录某套拦截系统当前可以拦截的高度。
贪心可过,每读入一个导弹高度,和之前能打到的最低的比较,如果导弹比之前的高,那就要增加一套拦截系统,并且将此导弹的高度记录下来。如果比之前的低,那么让最近的比它高的那套拦截系统拦截它,并且更改那一套的dp值。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmath> 7 #include <queue> 8 #include <map> 9 #include <set> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 14 using namespace std; 15 16 const int maxn = 30010; 17 int n; 18 int tmp; 19 int dp[maxn]; 20 21 int main() { 22 // freopen("in", "r", stdin); 23 while(~scanf("%d", &n)) { 24 int cnt = 1; 25 int flag = 0; 26 while(n--) { 27 scanf("%d", &tmp); 28 if(!flag) { 29 dp[0] = tmp; 30 flag = 1; 31 } 32 int i; 33 for(i = 0; i < cnt; i++) { 34 if(tmp <= dp[i]) { 35 dp[i] = tmp; 36 break; 37 } 38 } 39 if(i == cnt) { 40 dp[cnt++] = tmp; 41 } 42 } 43 printf("%d ", cnt); 44 } 45 }