首先要知道,对于序列中任意一个数,如果它后面有一个数比它大,那么那个数必定得用另一个拦截系统
以此可以推出,需要的最少拦截系统就是这个序列最长上升子序列的长度(自己证明一下)
接下来就按最长上升子序列来做了(这道题也可以用贪心来做)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=10000+10;
int d[N],a[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(d,0,sizeof(d));
d[1]=1;
int ans=1;
for(int i=2;i<=n;i++)
{
int m=0;
for(int j=1;j<i;j++)
if(d[j]>m&&a[j]<a[i])
m=d[j];
d[i]=m+1;
if(d[i]>ans)
ans=d[i];
}
printf("%d\n",ans);
}
return 0;
}
本文介绍了一种求解最长上升子序列的算法实现,并通过一个具体示例展示了如何使用该算法来确定序列中最长上升子序列的长度。该算法适用于需要解决特定拦截系统配置问题的情况。

5641

被折叠的 条评论
为什么被折叠?



