第一问,求最长不递增序列,普通DP复杂度为n*n,考虑用树状数组降低复杂度为n*log(n)
普通DP:
for(int i=1;i<=n;i++) f[i]=1;//以i结尾的最长不上升序列长度
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(a[j]<=a[i])
{
f[j]=max(f[j],f[i]+1);
ans1=max(ans1,f[j]);//更新ans1
}
}
}
树状数组:
将导弹高度作为数组下标,用树状数组不断更新区间最大长度,由于要用的是下标从1到下标为当前导弹高度的区间的最长不上升序列长度,因此可以不用线段树,用树状数组,查询时,从开头查到该点,更新时,从该点向后更新。
# include<iostream>
# include<stdio.h>
# include<algorithm>
# define maxn 100000+2
# include<string.h>
using namespace std;
int bit[maxn];
int lowbit(int x)
{
return x&(-x);
}
int query(int x)
{//向前求最大
int s=0;