79-拦截导弹
内存限制:64MB
时间限制:3000ms
特判: No
通过数:9
提交数:11
难度:3
题目描述:
某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。
输入描述:
第一行输入测试数据组数N(1<=N<=10) 接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20) 接下来行输入导弹依次飞来的高度,所有高度值均是大于0的正整数。
输出描述:
输出最多能拦截的导弹数目
样例输入:
2 8 389 207 155 300 299 170 158 65 3 88 34 65
样例输出:
6 2
分析:
1、与最长串类似的问题;
2、通过动态规划找出找出前面的最长组合;
3、依次往后考虑,得到的就是最优解(全局最长);
4、状态方程:dp[i] = max(dp[i], dp[j] + 1);
方法一:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <stack> 7 #include <map> 8 #include <queue> 9 #include <set> 10 11 using namespace std; 12 const int MAXN = 25; 13 14 int main() 15 { 16 int N; 17 scanf("%d", &N); 18 while(N --) 19 { 20 int n, a, A[MAXN], cnt = 0; 21 scanf("%d%d", &n, &A[0]); 22 while(-- n) 23 { 24 scanf("%d", &a); 25 if (A[cnt] > a) 26 A[++cnt] = a; 27 else 28 { 29 for(int i = 0; i <= cnt; ++ i) 30 if(A[i] <= a) 31 { 32 A[i] = a; 33 break; 34 } 35 } 36 } 37 printf("%d ", cnt + 1); 38 } 39 return 0; 40 }
方法二:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <stack> 7 #include <map> 8 #include <queue> 9 #include <set> 10 11 using namespace std; 12 const int MAXN = 25; 13 14 int main() 15 { 16 int N; 17 scanf("%d", &N); 18 while(N --) 19 { 20 int n, a, A[MAXN], cnt = 0, dp[MAXN]; 21 scanf("%d", &n); 22 for(int i = 0; i < n; ++ i) 23 { 24 dp[i] = 1; 25 scanf("%d", &A[i]); 26 for(int j = 0; j < i; ++ j) 27 if (A[i] < A[j]) 28 dp[i] = max(dp[i], dp[j] + 1); 29 cnt = max(cnt, dp[i]); 30 } 31 printf("%d ", cnt); 32 } 33 return 0; 34 }