单位网站建设有机房吗,wordpresS追踪访问轨迹,永久免费linux服务器,有人打电话说请我做网站 骗子【问题描述】 某国为了防御敌国的导弹袭击#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷#xff1a;虽然 它的第一发炮弹能够到达任意的高度#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天#xff0c;雷达捕捉到 敌国的导弹来袭。由于该…【问题描述】 某国为了防御敌国的导弹袭击发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷虽然 它的第一发炮弹能够到达任意的高度但是以后每一发炮弹都不能高于前一发的高度。某天雷达捕捉到 敌国的导弹来袭。由于该系统还在试用阶段所以只有一套系统因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度雷达给出的高度数据是不大于
30000
的正整数计算这套系统最多能拦 截多少导弹如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 【输入文件】
missile.in
单独一行列出导弹依次飞来的高度。 【输出文件】
missile.out
两行分别是最多能拦截的导弹数要拦截所有导弹最少要配备的系统数 【输入样例】
389 207 155 300 299 170 158 65
【输出样例】
6
2
思路
设导弹高度序列表示为x1,x2,x3,……,xn
因为一套拦截系统所能拦截的导弹高度是逐渐下降的所以对于序列中xi xj(ij)那么第j颗导弹与第i颗导弹肯定不能使用一套系统进行拦截。考虑这个导弹序列的最长上升子序列设其长度为k那么我们可以知道至少需要准备k套导弹。实际上k套导弹是足够将所有的n发导弹击落的。 #include iostream
#include cstdio
#include cstring
#include algorithm
using namespace std;
const int MAX 10000;
int dp[MAX];
int a[MAX];
int main(){int n;while(~scanf(%d,n)){for(int i 0;i n;i){scanf(%d,a[i]);}int ans 0;for(int i 0;i n;i){dp[i] 1;for(int j 0;j i;j){if(a[i] a[j])dp[i] max(dp[i],dp[j] 1);}ans max(ans,dp[i]);}coutansendl;} return 0;
}