ModricWang的導彈攔截系統1564(LIS模板題)
阿新 • • 發佈:2018-12-10
題目描述
某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); }