考研机试真题--拦截导弹--北京大学

xiaoxiao2021-03-01  3

关键字:最长不下降子序列

题目描述 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。 输入描述: 每组输入有两行, 第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25), 第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。 输出描述: 每组输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。 示例1 输入 8 300 207 155 300 299 170 158 65 输出 6

思路: 最长不下降子序列: 设dp[i]为以i为结尾(必须包括i)的最长不下降子序列的长度,那么dp[i]的取值有下面几种情况: 如果i前面的j符合条件(i的导弹长度len比i大),那么dp[i] = dp[j] + 1,因为要选择最长的子序列,就是从所有的j

#include <iostream> #include <fstream> #include <cmath> using namespace std; int main(){ // freopen("a.txt", "r", stdin); int k; while(cin >> k){ int len[30] = {0}; int dp[30] = {0}; for(int i = 0; i < k; ++i){ cin >> len[i]; } dp[0] = 1; for(int i = 1; i < k; ++i){ int maxL = 1; for(int j = 0; j < i; ++j){ if(len[i] <= len[j]){ maxL = max(maxL, dp[j] + 1); } } dp[i] = maxL; } int ans = 1; for(int i = 0; i < k; ++i){ if(ans < dp[i]) ans = dp[i]; } cout << ans << endl; } }
转载请注明原文地址: https://www.6miu.com/read-3850139.html

最新回复(0)