uva 10534 dp
2015-08-16 00:29
344 查看
UVA 10534 - Wavio Sequence
定义一种 Wavio 的序列。其长度为2*n+1,前n+1严格递增,后n+1个严格递减。
求在给的序列中找一个最长的 Wavio 子序列。输出长度。
正向LIS求出每个点以该点为结尾的最长上升子序列长度p[i],然后反向LIS求出以该点位开头的最长递减子序列长度q[i]。
然后枚举 Wavio 子序列的中点,该店的 Wavio 长度为 2 * min(p[i], q[i]) - 1;
定义一种 Wavio 的序列。其长度为2*n+1,前n+1严格递增,后n+1个严格递减。
求在给的序列中找一个最长的 Wavio 子序列。输出长度。
正向LIS求出每个点以该点为结尾的最长上升子序列长度p[i],然后反向LIS求出以该点位开头的最长递减子序列长度q[i]。
然后枚举 Wavio 子序列的中点,该店的 Wavio 长度为 2 * min(p[i], q[i]) - 1;
[code]#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int INF = 999999999; int n; int a[10000+5]; int dp[10000+5]; int p[10000+5]; int dq[10000+5]; int q[10000+5]; int main () { freopen("out.txt", "w", stdout); for (; scanf ("%d", &n) == 1;) { for (int i=0; i<n; i++) { scanf ("%d", &a[i]); } fill(dp,dp+n,INF); for (int i=0;i<n;i++){ *lower_bound(dp,dp+n,a[i]) = a[i]; p[i] = lower_bound(dp,dp+n,a[i])-dp + 1; } reverse(a, a+n); fill(dq,dq+n,INF); for (int i=0;i<n;i++){ *lower_bound(dq,dq+n,a[i]) = a[i]; q[i] = lower_bound(dq,dq+n,a[i])-dq + 1; } reverse(q, q+n); reverse(a, a+n); int ans = 1; for (int i=1; i<n-1; i++) { ans = max(ans, 2*min(p[i], q[i])-1); } printf ("%d\n", ans); } return 0; }
相关文章推荐
- HDU 1695 GCD (容斥 + 莫比乌斯反演)
- JAVA编程——static与final详解
- iOS开发-assign、retain、copy、strong、weak的区别
- 封装scrollView 循环滚动,tableViewCell(连载) mvc
- 交错正负数
- uva 1424 dp
- win7安装openssl,编译32位&64位
- Java基础之反射
- POJ - 3177 Redundant Paths(强连通分量)
- Gym - 100203I I WIN 网络流
- UVA 11584 dp
- 手动查杀skypee病毒(AutoIt3木马)
- 链队列的实现
- poj1035 spell checker (简单的字符串查找题)
- 费用流 poj2195 Going Home
- uva 1610 Party Games
- 2015华为软件精英挑战赛德州扑克之蒙特卡洛法模拟胜率
- iPhone入门开发系列2备忘录APP学习03--table view
- 基于火狐和谷歌浏览器的html5调用摄像头
- hdu5392 Infoplane in Tina Town(LCM)