8780:拦截导弹
【题目链接】
题目描述
第一行是一个整数N(不超过15),表示导弹数。
第二行包含N个整数,为导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数)。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹。
输入描述:
第一行为一个数T 表示测试样例组数
对于每组测试数据
第1行输入a,b,n; 分别为小架子的数量,大架子的数量,带了仓鼠的人数
第2行有n个数字P1-Pn,分别表示每个人带的仓鼠的数量
输出描述:
一个整数,表示最多能拦截的导弹数。
输入
8
389 207 155 300 299 170 158 65
输出
6
思路分析
题目说白了就是求最长下降子序列,用动态规划,解决此类问题的第一步就是将这个问题分为若干个子问题,在此题中,我们假定自问题为,已知前n-1
个元素为终点的最长下降子序列长度已知,当加入第n
个元素时,求以第n
个元素为终点的最长下降子序列长度,显然,这个子问题如果解决了,那么这个大问题也就解决了。
这个子问题的解法也很简单,我们只需要遍历前n-1
个元素,看是否大于第n
个元素,然后更新最大值即可
for (j=1;j<i;j++)
{ if (dp[j]>dp[i]) maxs[i]=max(maxs[i],maxs[j]+1); }
AC代码。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int i,j,n;
cin>>n;
int dp[n+1],maxs[n+1];
memset(maxs,0,sizeof(maxs));
for (i=1;i<=n;i++)
cin>>dp[i];
maxs[1]=1;
for (i=2;i<=n;i++)
{
for (j=1;j<i;j++)
{
if (dp[j]>dp[i])
maxs[i]=max(maxs[i],maxs[j]+1);
}
if (maxs[i]==0)
maxs[i]=1;
}
sort(maxs,maxs+n+1);
cout<<maxs[n];
}