您的位置:首页 > 其它

关于最长下降序列的简单优化

2018-03-23 23:05 197 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: