UVA 10534--Wavio Sequence+二分+DP
来源:互联网 发布:python redis 库 编辑:程序博客网 时间:2024/05/22 12:00
开始的时候一直想不到一个合适的状态转移方程;
后面想到可以分别求以中间那个数为终点和起点的最长上升子序列的长度,
然后以这个数为中心数的Wavio Sequence的长度就是其中短的那个值*2-1的值;
然后我们取所有数Wavio Sequence的最大长度作为答案。
这个题目卡了n^2的求最长上升子序列的算法,必须用nlgn算法才能过。
代码如下:
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;int a[10010],n;int d1[10010],d2[10010];int d[10010];int lower_bound(int* A,int x,int y,int v){ int m; while(x<y) { m=x+(y-x)/2; if(A[m]>=v) y=m; else x=m+1; } return x;}int main(){ while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) d1[i]=1,d2[i]=1; int len=1; d[1]=a[1]; for(int i=2;i<=n;i++) { if(a[i]>d[len]) { d[++len]=a[i]; d1[i]=len; } else { int t=lower_bound(d,1,len,a[i]); d[t]=a[i]; d1[i]=t; } } len=1; d[1]=a[n]; for(int i=n-1;i>=1;i--) { if(a[i]>d[len]) { len++; d[len]=a[i]; d2[i]=len; } else { int t=lower_bound(d,1,len,a[i]); d[t]=a[i]; d2[i]=t; } } int ans=0; for(int i=1;i<=n;i++) ans=max(ans,min(d1[i],d2[i])*2-1); printf("%d\n",ans); } return 0;}
1 0
- UVA - 10534 Wavio Sequence LIS 二分+DP
- UVA 10534--Wavio Sequence+二分+DP
- UVA 10534 Wavio Sequence DP(LIS+二分)
- UVa 10534 Wavio Sequence (最长递增子序列 DP 二分)
- UVa 10534 Wavio Sequence ( DP 二分 最长递增子序列 )
- uva 10534 Wavio Sequence | dp
- Wavio Sequence - UVa 10534 dp
- UVA 10534 - Wavio Sequence(DP)
- uva 10534 - Wavio Sequence (dp)
- UVA 10534 Wavio Sequence(dp + LIS)
- UVA 10534 - Wavio Sequence(经典dp)
- UVa 10534 - Wavio Sequence DP+最长上升子序列(严格上升)+二分查找(nlogn)
- (DP6.1.4.3)UVA 10534Wavio Sequence(利用二分查找来富足DP)
- uva 10534 Wavio Sequence
- UVA 10534 Wavio Sequence
- UVA 10534 - Wavio Sequence
- uva 10534 Wavio Sequence
- Uva-10534-Wavio Sequence
- Js解析Json字符串
- ZOJ Problem Set - 2830 Champion of the Swordsmanship
- Spark本地安装和简单示例
- LeetCode - Gas Station 题解
- NYOJ_39
- UVA 10534--Wavio Sequence+二分+DP
- 分类算法中的ROC与PR指标
- C# Managed DirectX 绘制静止三角形
- `Android跨进程机制的选择
- webservice简单环境搭建
- 2014年终总结——奋斗,在路上
- 理解Shared Pool 2
- 常用电脑快捷键大全
- homework