【题目链接】

题目描述

第一行是一个整数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];
}