入侵与反击

本文介绍了一道暑期集训算法题“入侵与反击”的解决方案。该问题属于最大严格递减子序列问题,通过动态规划求解。文章提供了完整的C++代码实现。

问题 F: 入侵与反击

时间限制: 1 Sec   内存限制: 128 MB
提交: 232   解决: 29
[ 提交][ 状态][ 讨论版]

题目描述

A国部署的反导系统遇到了一个致命BUG,那就是每一次发射的拦截导弹的飞行高度都将只能小于等于上一枚导弹的飞行高度,第一次发射的拦截导弹的飞行高度可以看作是足够大。对于A国,这是一件很严重的问题,这意味着A国的防空系统面临空前危机。

通过对A国的军事部门计算机的入侵,A国还不知道敌对国B国刚才已经发现了这项BUG。更不知道,在这项BUG的报告书上交到B国空军司令部那一刻,三分钟后B国的全体高级空军军官已经在作战室讨论作战方案。

如果战争真的开始,B国将依次派出n架战斗机,A国将依次发射拦截导弹,这n架飞机的飞行高度分别是h1,h2,h3.....hnB国将要充分利用这项漏洞,考虑到这么一种情况,假设只要A国的导弹的飞行高度大于等于B国飞机就能百分之百地锁定并击落,那么B国,最少将会有几架不被击落飞机?

输入

第一行为T,表示有T组输入数据(T<200)

每组数据第一行是n,代表有n架飞机(1=<n<=20 000)。

接下来一行有n个数,分别代表n架飞机的飞行高度,飞机飞行高度maxh(1<=maxh<=50 000)

输出

对于每组测试数据,在每行中输出一个数。表示B国最少将会有几架未被击落飞机。

样例输入

2110006340 260 101 405 278 89

样例输出

02

最大严格递减子数列问题。

简单的动态规划就ok。

# include<cstdio>
# include<algorithm>
using namespace std;
int a[20000],dp[20000],res;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		res=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			dp[i]=1;
		}
		for(int i=0;i<n;i++)
		{
			
			for(int j=0;j<i;j++)
			{
				if(a[j]>=a[i])
				{
					dp[i]=max(dp[i],dp[j]+1);
				} 
			}
			res=max(res,dp[i]);
		}
		printf("%d\n",n-res);
	}
} 
 
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值