【最长非上升子序列】删除最少的元素
2018-03-09 10:51
351 查看
其实就是最长上升子序列的一种变相,要求最长非上升子序列,其实就是把大小顺序换一下,替换是去替换子序列中那个第一个比你小的数。分两次,从头和从尾开始,dp[i]表示到达i的子序列长度。加起来-1就是两个序列到i的长度和。#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
long long a[n+1];
for(int i=1;i<=n;i++)
cin>>a[i];
int dp[n+1];
int len1=1,len2=1;
long long ans1[n+1],ans2[n+1];
memset(dp,0,sizeof(dp));
memset(ans1,0,sizeof(ans1));
memset(ans2,0,sizeof(ans2));
ans1[1]=a[1];
ans2[1]=a
;
dp[1]=1; //注意
for(int i=2;i<=n;i++)
{
if(a[i]<ans1[len1])
{
ans1[++len1]=a[i];
}
else
{
int pos=len1;
while(ans1[pos]<a[i] && pos!=0)
pos--;
ans1[pos+1]=a[i];
}
dp[i]=len1;
}
dp
+=1; //注意
for(int i=n-1;i>=1;i--) //注意
{
if(a[i]<ans2[len2])
{
ans2[++len2]=a[i];
}
else
{
int pos=len2;
while(ans2[pos]<a[i] && pos!=0)
pos--;
ans2[pos+1]=a[i];
}
dp[i]+=len2;
}
int maxx=0;
for(int i=1;i<=n;i++)
{ if(maxx<dp[i])
maxx=dp[i];
}
cout<<n-(maxx-1);
return 0;
}对于代码中标注的细节要注意。我这里是直接用一个dp来存长度,也可以分别用dp1 dp2数组最后相加找最大值。
相关文章推荐
- pta L2-014. 列车调度 Dilworth定理(最少下降子序列数等于最长上升子序列长度)@
- HDU5748---(记录每个元素的 最长上升子序列 nlogn)
- Longest Ordered Subsequence与最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)
- ZOJ 2319 最长上升子序列并输出组成该序列的元素编号
- 动态规划 最长上升(下降)子序列 SDNUOJ 1040 导弹拦截和最少拦截系统
- HDU-1257 最少拦截系统 贪心/DP 最长上升子序列的长度==最长不上升子序列的个数?
- hdu5489(删除一段后的最长上升子序列长度)LIS
- HDU 1257 最少拦截系统(最长上升子序列 动态规划(DP))
- 【最长上升子序列】杭电 hdu 1257 最少拦截系统
- HDU 1257 最少拦截系统【最长上升子序列】
- 面试题精选(84):使序列有序的最少交换次数(minimum swaps) + 删除序列中所有重复的元素
- 最长上升子序列 LIS(Longest Increasing Subsequence)
- 最长上升子序列(LIS)的两种算法
- 最长上升子序列的变形(N*log(N))hdu5256
- 题目1533:最长上升子序列-九度
- HDU4604.Deque——nlogn求最长上升子序列的长度
- POJ 1836 Alignment(DP max(最长上升子序列 + 最长下降子序列))
- 最长上升(下降)子序列 O(nlogn)
- OJ1306-最长公共子上升序列【dp】
- HDOJ 题目1257最少拦截系统(最长递增子序列长度)