波浪子序列 Wavio Sequence UVA10534 动态规划 最长上升子序列变形
2013-09-23 21:59
337 查看
此题的大意是给定一个序列,求一个最长的奇数子序列,使得前k个序列上升,后k个序列下降。
此题的解法是从左往右求一次最长上升子序列,然后从右往左再求一次最长上升子序列,分别记录在状态变量d1[i],d2[i],求min(d1[i],d2[i])的最大值即可,答案就是2*min-1。
此题的解法是从左往右求一次最长上升子序列,然后从右往左再求一次最长上升子序列,分别记录在状态变量d1[i],d2[i],求min(d1[i],d2[i])的最大值即可,答案就是2*min-1。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> using namespace std; #define MAXN 10010 #define INF 1000000000 int seq[MAXN]; int d1[MAXN],d2[MAXN]; int g[MAXN]; int main() { int n; while(scanf("%d",&n)==1) { for(int i=1;i<=n;i++)scanf("%d",&seq[i]); for(int i=1;i<=n;i++)g[i]=INF; memset(d1,0,sizeof(d1)); for(int i=1;i<=n;i++) { int k=lower_bound(g+1,g+1+n,seq[i])-g; d1[i]=k; g[k]=seq[i]; } for(int i=1;i<=n;i++)g[i]=INF; memset(d2,0,sizeof(d2)); for(int i=n;i>=1;i--) { int k=lower_bound(g+1,g+1+n,seq[i])-g; d2[i]=k; g[k]=seq[i]; } int ans=0; for(int i=1;i<=n;i++) { ans=max(ans,min(d1[i],d2[i])); } cout<<2*ans-1<<endl; } }
相关文章推荐
- 波浪子序列 Wavio Sequence UVA10534 动态规划 最长上升子序列变形
- joj 2529 Chorus 动态规划 最长上升子序列和最长下降子序列
- hdu5256 序列变换 百度之星初赛第二场 最长上升子序列变形
- 最长上升子序列变形题-二分查找DP
- 九度OJ 1533 最长上升子序列 -- 动态规划
- nyoj 16 最长上升子序列变形
- 【算法】动态规划 最长上升子序列
- SDUT_最长上升子序列长度_动态规划
- 动态规划--最长上升子序列问题(LIS) O(n^2) ,O(nlogn)
- HDU 1087 Super Jumping! Jumping! Jumping! (最长上升子序列求和)【最长序列求和类模板】
- 矩形嵌套--动态规划--最长递增子序列问题变形
- 动态规划--(最长上升子序列 poj2533)
- 动态规划——求最长下降/上升子序列
- Longest Ordered Subsequence与最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)
- 最长上升子序列(LIS)的O(nlogn) & O(n^2)算法 - 动态规划
- 【HDU】5256 序列变换(最长上升子序列变形)
- poj1836--Alignment(dp,最长上升子序列变形)
- hdu 1069 最长上升子序列变形
- 动态规划之最大公共序列+最长上升子序列
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)