题目链接
题解:就是LIS模型,这里要说的是g[i]。
(因为LIS模型很简单,这里不再说明)
我们先分析题目:题目中要求的是要求出需要多少个导弹,其实也就最少需要多少个公序列可以包含所有的数。
分析:其实我们可以深入分析以下为何会出现那种不能一下将所有导弹拦截,因为出现了回升,所以这个也就是求最长上升子序列。我们将每个下降子序列中都拿出最大的数,就可以组成最长上升子序列。
如:5 6 3 2 1 4 这个题在5 3 2 1 ,6 4我们将5 6 拿出来就是最长上升子序列。
下面是AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1010;
int dp[N],g[N],a[N];
int main()
{
int n=0;
while(cin >> a[++n]);
n--;
int maxx1=-1;
int maxx2=-1;
for(int i=1;i<=n;i++)
{
dp[i]=1;
g[i]=1;
for(int j=1;j<i;j++)
{
if(a[i]<=a[j]) dp[i]=max(dp[i],dp[j]+1);
else g[i]=max(g[i],g[j]+1);//假设和他不是一组的,就要至+1,开始的时候只分析了最小组的
}
maxx1=max(maxx1,dp[i]);
maxx2=max(maxx2,g[i]);
}
cout<<maxx1<<endl<<maxx2<<endl;
}