ModricWang的导弹拦截系统1564(LIS模板题)

题目描述

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

输入

第一个数为数据组数n,n<16

第二行为n个整数,为导弹依次飞来的高度

输出

一个整数,这套系统最多能拦截多少导弹

输入样例

8
389 207 155 300 299 170 158 65

输出样例

6

LIS模板题,求最长下降子序列时反向输入数组元素即可。
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include<algorithm>
#include<queue>
using namespace std;

const int maxn=20;
int a[maxn];
//dp[i]表示以第i个元素结尾的最长递增子序列的长度
int dp[maxn];
int LIS(int a[],int n){
    int maxe=-1;
    for(int i=1;i<=n;++i)
        dp[i]=1;
    for(int i=2;i<=n;++i){
        maxe=-1;
        for(int j=1;j<=i-1;++j){
            if(a[i]>a[j]&&dp[j]>maxe){
                maxe=dp[j];
            }
        }
        dp[i]=maxe+1;
    }
    maxe=dp[1];
    for(int i=1;i<=n;++i){
        if(dp[i]>maxe)
            maxe=dp[i];
    }
    return maxe;
}
int main(){
    int n,ans;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[n-i+1]);
    }
    ans=LIS(a,n);
    printf("%d\n",ans);
}

LIS模板

#include <cstdio>
#include <cstring>
#include <iostream>
#include<algorithm>
#include<queue>
using namespace std;

const int maxn=20;
int a[maxn];
//dp[i]表示以第i个元素结尾的最长递增子序列的长度
int dp[maxn];
int LIS(int a[],int n){
    int maxe=-1;
    for(int i=1;i<=n;++i)
        dp[i]=1;
    for(int i=2;i<=n;++i){
        maxe=-1;
        for(int j=1;j<=i-1;++j){
            if(a[i]>a[j]&&dp[j]>maxe){
                maxe=dp[j];
            }
        }
        dp[i]=maxe+1;
    }
    maxe=dp[1];
    for(int i=1;i<=n;++i){
        if(dp[i]>maxe)
            maxe=dp[i];
    }
    return maxe;
}
int main(){
    int n,ans;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[n]);
    }
    ans=LIS(a,n);
    printf("%d\n",ans);
}
 

猜你喜欢

转载自www.cnblogs.com/loganlzj/p/10098172.html
今日推荐