题目大意:
输入N,表示雷达监测到来袭的导弹数目,之后输入每个导弹的发射高度,因为每套系统第一次发射的导弹高度任意高,后续发射的导弹不能高于先前的高度,所以计算打落所有导弹所需要的最小系统数量。
算法思想:
因为每套系统所发射的导弹是非递增的序列,所以只需求出所有来袭导弹的最长上升序列的规模数即为需要的系统数。用dp[i]记录到i的最长上升子序列,状态方程为
dp[i]=max(dp[j])+1 (1=<j<i) .
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=10000;
int H[MAXN];
bool vis[MAXN];
int dp[MAXN];//记录最大长度
int LIS(int H[],int N){
int m=0;
int ans=1;
dp[1]=1;
vis[1]=true;
for(int i=2;i<=N;i++){
m=0;
for(int j=1;j<i;j++){
if(dp[j]>m&&H[j]<H[i]){
m=dp[j];
}
}
dp[i]=m+1;
ans=max(ans,dp[i]);
}
return ans;
}
int main(){
int N;
while(cin>>N){
for(int i=1;i<=N;i++){
cin>>H[i];
}
cout<<LIS(H,N)<<endl;
}
return 0;
}