10^5的数据 看了很多博客拿STL写的 由于自己才疏学浅没有掌握
就按照领悟到的方法写了一遍 虽然偷懒没有将二分加入但是缺大大降低了复杂度
原理其实很简单 设置另外一个数组dp记录 下降数列 如果遍历到的数比dp[len]要大那说明不能加入到下降的末尾
只能在前面的元素中找到一个数比他要小但是最接近他并将其替换
那么dp中只会存储到每个长度的最大值
这样形成的dp数组有点背包的味道 因为新记录的每个长度的最大值不会影响到以前的记录!
寻找值有两种方法:
1.简单从头遍历 因为dp是递减数列所以第一个小于当前数的元素即是最优值
2.二分,如果dp[mid]比他大即在右边寻找 反之 则在左边寻找
ac代码如下:
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include <queue>
#include<cstdlib>
using namespace std;
int main()
{
int n,i,j,min_,t;
int dp[100005];
int zdy[100005];
while(scanf("%d",&n)!=EOF)
{
int len=1;
scanf("%d",&dp[1]);
for(i=1;i<n;i++)
{
scanf("%d",&t);
if(t<dp[len])
dp[++len]=t;
else
{
for(j=1;j<=len;j++)
if(t>dp[j])
{
dp[j]=t;
break;
}
}
}
printf("%d\n",n-len);
}
return 0;
}