关于最长下降序列的简单优化
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;
}
原理其实很简单 设置另外一个数组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;
}
相关文章推荐
- C++ 关于最长下降子序列问题
- 关于最长上升子序列的算法 简单dp
- 关于DP中的最长不下降序列问题分析
- 关于最长不下降子序列O(nlogn)算法
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法实现及其优化
- 最长不下降子序列及二分优化
- 关于最长不下降子序列的优化
- 动态规划 最长上升(下降)子序列 SDNUOJ 1040 导弹拦截和最少拦截系统
- 深度学习(三十七)优化求解系列之(1)简单理解梯度下降
- hdu1160简单dp最长下降子序列
- uva 10131 Is Bigger Smarter ? (简单dp 最长上升子序列变形 路径输出)
- 最长不下降子序列 (O(nlogn)算法)
- 最长不下降子序列(动态规划)
- 最长不上升(下降)子序列——拦截导弹
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 L. The Heaviest Non-decreasing Subsequence Problem(最长不下降子序列变形)
- 关于tomcat服务器优化,常遇到的一些简单问题的解决方法 (z)
- 最长不下降子序列(n log n)做法
- 最长下降子序列优化
- POJ 2533--Longest Ordered Subsequence【最长递增子序列 + 二分优化】
- 最长非降/下降子序列问题(DP)(待续...)