1. 程式人生 > >ModricWang的導彈攔截系統1564(LIS模板題)

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);
}