Laoj P1199 [noip1999]拦截导弹


问题背景

动态规划入门-第18题

试题描述

某国为了防御敌国的导弹袭击,发明出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

现在,要你计算出这套系统最多能拦截多少枚导弹,并且如果要拦截所有导弹的话,最少要配备多少套这种导弹拦截系统。


输入格式

输入数据为两行。
第一行为一个整数,表示导弹的数目N。
第二行为N个整数,表示第i枚导弹飞来的高度Hi。

输出格式

输出只有一行。

这一行只有两个整数,即这套系统最多能拦截的导弹数和要拦截所有导弹最少要配备这种导弹拦截系统的套数。


输入示例

8
389 207 155 300 299 170 158 65


输出示例

6 2


注释说明

1≤N≤1000,1≤Hi≤30000。

【分析】

先做第一问,LIS一遍即可。

再看第二问,即求至少有多少个最长不上升子序列,每次从最高的点开始找就可以啦。

依然dp入门,很水。

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int ans, n, a[1020], dp[1020], fa[1020];
 5 bool vis[1020];
 6
 7 void init()
 8 {
 9     cin >> n;
10     for (int i=1;i<=n;++i)
11         cin >> a[i];
12 }
13
14 bool check() {
15     for (int i=1;i<=n;++i)
16         if (!vis[i])
17             return false;
18     return true;
19 }
20
21 void sovle1()
22 {
23     memset(dp, 0, sizeof(dp));
24     ans=0;
25     for (int i=1;i<=n;++i) {
26         dp[i]=1;
27         for (int j=1;j<i;++j)
28             if (a[i]<=a[j])
29                 dp[i]=max(dp[i], dp[j]+1);
30         ans=max(ans, dp[i]);
31     }
32     cout << ans;
33     return;
34 }
35
36 void sovle(int x) {
37     if (fa[x])
38         vis[fa[x]]=true;
39     else
40         return;
41     sovle(fa[x]);
42 }
43
44 void sovle2() {
45     for (int k=1;;++k) {
46         memset(dp, 0, sizeof(dp));
47         memset(fa, 0, sizeof(fa));
48         if (check()) {
49             cout << k-1 << endl;
50             exit(0);
51         }
52         int maxx=0, maxi=0, t=0, ti=0;
53         for (int i=1;i<=n;++i) {
54             if (!vis[i] && maxx<a[i])
55                 maxx=a[i], maxi=i;
56         }
57         for (int i=maxi;i<=n;++i) {
58             dp[i]=1;
59             for (int j=maxi;j<i;++j) {
60                 if (!vis[i] && !vis[j] && a[i]<=a[j] && dp[j]+1>dp[i]) {
61                     fa[i]=j, dp[i]=dp[j]+1;
62                 }
63             }
64             if (dp[i]>t)
65                 t=dp[i], ti=i;
66         }
67         vis[ti]=true;
68         sovle(ti);
69     }
70 }
71
72 int main()
73 {
74     init();
75     sovle1();
76     cout << " ";
77     sovle2();
78 }
时间: 2024-10-08 09:30:28

Laoj P1199 [noip1999]拦截导弹的相关文章

NOIP1999 拦截导弹

@font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @font-face{ font-family:"Symbol"; } @font-face{ font-family:"Wingdings"; } @font-face{ font-family:"黑体"; } @list l0:level1{ mso-

[NOIP1999]拦截导弹 DP

题目描述题目链接 请点击 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 输入格式 输入数据为两行, 第一行为导弹的数目N(n<=1000) 第二行导弹依次飞来的高度,所有高度值均为不大于30000的正整数. 输出格式 1.输出只有一行是这套系统最多能拦截的导弹数和 2.要拦截

拦截导弹问题(Noip1999)

1322:[例6.4]拦截导弹问题(Noip1999) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 3843     通过数: 1373 [题目描述] 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段.所以一套系统有可能不能拦截所有的导弹. 输入导弹依次飞来的高度(雷达给出的高度不大于30000

1260:【例9.4】拦截导弹(Noip1999)

题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1260 1260:[例9.4]拦截导弹(Noip1999) 时间限制: 1000 ms         内存限制: 65536 KB提交数: 4533     通过数: 1660 [题目描述] 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于

tyvj P1209 - 拦截导弹 平面图最小割&amp;&amp;模型转化

P1209 - 拦截导弹 From admin    Normal (OI)总时限:6s    内存限制:128MB    代码长度限制:64KB 背景 Background 实中编程者联盟为了培养技术精湛的后备人才,必须从基础题开始训练. 描述 Description 某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试验阶段,所以只有

拦截导弹(线性动态规划)

1315: 拦截导弹 时间限制: 1 Sec  内存限制: 128 MB提交: 46  解决: 16[提交][状态][讨论版] 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000 的正整数),计算这套系统最多能

nyoj 814 又见拦截导弹

又见拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.突然有一天,雷达捕捉到敌国的导弹来袭.由于该系统存在缺陷,所以如果想把所有的导弹都拦截下来,就要多准备几套这样的导弹拦截系统.但是由于该系统成本太高,所以为了降低成本,请你计算一下最少需要

codevs 1044 拦截导弹 1999年NOIP全国联赛提高组

1044 拦截导弹 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 输入描述 Input Description 输入导弹

codevs1409 拦截导弹2

[问题描述]一场战争正在 A 国与 B 国之间如火如荼的展开.B 国凭借其强大的经济实力开发出了无数的远程攻击导弹,B 国的领导人希望,通过这些导弹直接毁灭 A 国的指挥部,从而取得战斗的胜利!当然,A 国人民不会允许这样的事情发生,所以这个世界上还存在拦截导弹.现在,你是一名 A 国负责导弹拦截的高级助理.B 国的导弹有效的形成了三维立体打击,我们可以将这些导弹的位置抽象三维中间的点(大小忽略),为了简单起见,我们只考虑一个瞬时的状态,即他们静止的状态.拦截导弹设计非常精良,可以精准的引爆对方