HDU:1257 最少拦截系统(贪心+动态规划DP||LIS?)

最少拦截系统

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

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

怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

 

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

 

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

 

Sample Input

8 389 207 155 300 299 170 158 65  

Sample Output

2  

Source
浙江工业大学第四届大学生程序设计竞赛  

Recommend

JGShining   |   We have carefully selected several similar problems for you:  1176 1003 1159 1421 1203 

题目大意:刚开始理解错了题意,原来能用已经部署的所用拦截系统来拦截导弹。

解题思路:用dp数组存储已经部署好的防御系统能打的最大高度,每来一个新的导弹,判断之前已经部署好的防御系统能否打下当前导弹,如果能的话就选那个最垃圾的防御系统来攻击导弹,如果之前已经部署的最厉害的防御系统也打不下来的话,那么就新部署一个拦截系统来拦截当前导弹。我这里没用LIS做。

代码如下:

#include <cstdio>
#define INF 0x3f3f3f3f
int a[10010];
int dp[10010];//记录已经部署的拦截系统能打的最大高度 
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		int num=1;
		dp[0]=a[0];//设置前键 
		for(int i=1;i<n;i++)
		{
			int flag=-1;//当标记使用并且如果能够找到之前已经 部署的拦截系统来打新来的导弹,就作为所用的那个拦截系统的角标 
			int MIN=INF;//找之前最垃圾的部署系统来打新来的导弹 
			for(int j=0;j<num;j++)
			{
				if(dp[j]>=a[i]&&dp[j]<MIN)//找之前最垃圾的部署系统来打新来的导弹 ;注意那个大于等于,题中说不超过,那么可以等于 
				{
					MIN=dp[j];
					flag=j;
				}
			}
			if(flag==-1)//之前的拦截系统们都打不下新来的导弹,那么就新部署一个拦截系统来打下当前的导弹 
			{
				dp[num]=a[i];//新部署的打下了当前的导弹,那么新部署的高度降为了a[i] 
				num++;//数量+1 
			}
			else
			{
				dp[flag]=a[i];//能打下来的话就用最垃圾的那个防御系统来拦截,更新了dp[flag] 
			}
		}
		printf("%d\n",num);
	}
	return 0;
}
    原文作者:动态规划
    原文地址: https://blog.csdn.net/zugofn/article/details/52179736
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞