题目描述
某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); }