hdoj 1257(暴力)

最少拦截系统

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 53723    Accepted Submission(s): 21061

Problem Description

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

Input

输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)

Output

对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.

Sample Input

8 389 207 155 300 299 170 158 65

Sample Output

2

因为没有给导弹个数的范围,所以不敢开数组去存下来,只好往着边输入边解决的方法去计算。

思路:暴力更新区间。

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn=30006;
 5 bool dp[maxn];
 6
 7 int main()
 8 {
 9     int n;
10     while( ~scanf("%d",&n)){
11         int top=0,ans=0,num;
12         memset( dp, false, sizeof dp);
13         for(int i=1;i<=n;i++){
14             scanf("%d",&num);
15             if(num>=top){
16                 ans++;
17                 dp[num]=true;
18                 top=num;
19             }
20             else{
21                 int j;
22                 for(j=num;j<=top;j++){
23                     if(dp[j]) break;
24                 }
25                 if(j==top){
26                     dp[top]=false;
27                     dp[num]=true;
28                     top=num;
29                 }
30                 else{
31                     dp[j]=false;
32                     dp[num]=true;
33                 }
34             }
35         }
36         printf("%d\n",ans);
37     }
38     return 0;
39 }

因为这道题目的是被某神放在dp里面,本菜鸡实在是没有想到dp的方法,就上网查题解看有没有人用dp去做的。

发现真的可以把导弹的每一个都存下来,然后用LIS。。。

说实话,把每个导弹的高度都存下来我就没有想。然而,确实能存。

下面的代码来自:https://blog.csdn.net/hurmishine/article/details/52926957

 1 #include<cstdio>
 2 const int maxn=10000;
 3 int a[maxn],dp[maxn];
 4 int n;
 5
 6 int LIS()
 7 {
 8     dp[1]=1;
 9     int ans=1;
10     for(int i=2;i<=n;i++){
11         int m=0;
12         for(int j=1;j<i;j++){
13             if(dp[j]>m&&a[j]<a[i])
14                 m=dp[j];
15         }
16         dp[i]=m+1;
17         if(dp[i]>ans)
18             ans=dp[i];
19     }
20     return ans;
21 }
22
23 int main()
24 {
25     while( ~scanf("%d",&n)){
26         for(int i=1;i<=n;i++)
27             scanf("%d",&a[i]);
28         printf("%d\n",LIS());
29     }
30     return 0;
31 }

原文地址:https://www.cnblogs.com/ZQUACM-875180305/p/9090234.html

时间: 2024-10-31 17:02:13

hdoj 1257(暴力)的相关文章

LIS HDOJ 1257 最少拦截系统

题目传送门 1 /* 2 LIS模板题:n - 最长下降子序列 -> 最长上升子序列 贪心做法以后再补:) 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <cstring> 7 #include <string> 8 #include <algorithm> 9 using namespace std; 10 11 const int MAXN = 1e4 + 10; 1

hdoj 1257 DP||贪心

最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 38985    Accepted Submission(s): 15293 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高

hdoj 1257最少拦截系统

 /*最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25347    Accepted Submission(s): 9959 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷: 虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超

hdoj 1257 最少拦截系统

最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24450    Accepted Submission(s): 9569 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度

HDOJ 1257 LIS

题目大意: 输入N,表示雷达监测到来袭的导弹数目,之后输入每个导弹的发射高度,因为每套系统第一次发射的导弹高度任意高,后续发射的导弹不能高于先前的高度,所以计算打落所有导弹所需要的最小系统数量. 算法思想: 因为每套系统所发射的导弹是非递增的序列,所以只需求出所有来袭导弹的最长上升序列的规模数即为需要的系统数.用dp[i]记录到i的最长上升子序列,状态方程为 dp[i]=max(dp[j])+1 (1=<j<i) . 代码如下: #include <iostream> #inclu

dp入门题目

本文文旨,如题... 转载请注明出处... HDOJ 1176 免费馅饼 http://acm.hdu.edu.cn/showproblem.php?pid=1176 类似数塔,从底往上推,每次都是从下面三个中选最大的 1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 100005 4 int dp[MAXN][11];//第i秒第j个位置的馅饼数 5 int max1(int a,int b) 6 { 7 return a

hdoj 4932 Miaomiao&#39;s Geometry 【暴力枚举】

题意:在一条直线上有n个点,取一长度差为x的区间, 规定点必须是区间的端点, 让你找出来最大的x 策略:rt 分析可得:两个相邻点之间的区间要么是两个点的差,要么就是两个点的差的一半,那我们就简单枚举一下就好了 排好序之后再枚举 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define M 200 using namespace std; do

hdoj 4932 Miaomiao&amp;#39;s Geometry 【暴力枚举】

题意:在一条直线上有n个点.取一长度差为x的区间. 规定点必须是区间的端点. 让你找出来最大的x 策略:rt 分析可得:两个相邻点之间的区间要么是两个点的差,要么就是两个点的差的一半,那我们就简单枚举一下就好了 排好序之后再枚举 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define M 200 using namespace std; do

HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力

一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 如果C2+2==C1则这条边再某个最大匹配中 Boke and Tsukkomi Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 649    Accepted Submission(s): 202