uva 10534 - Wavio Sequence (dp)
来源:互联网 发布:高级seo 编辑:程序博客网 时间:2024/06/06 18:39
Problem D
Wavio Sequence
Input: Standard Input
Output: Standard Output
Time Limit: 2 Seconds
Wavio is a sequence of integers. It has some interesting properties.
· Wavio is of odd length i.e. L = 2*n + 1.
· The first (n+1) integers of Wavio sequence makes a strictly increasing sequence.
· The last (n+1) integers of Wavio sequence makes a strictly decreasing sequence.
· No two adjacent integers are same in a Wavio sequence.
For example 1, 2, 3, 4, 5, 4, 3, 2, 0 is an Wavio sequence of length9. But1, 2, 3, 4, 5, 4, 3, 2, 2 is not a valid wavio sequence. In this problem, you will be given a sequence of integers. You have to find out the length of the longest Wavio sequence which is a subsequence of the given sequence. Consider, the given sequence as :
1 2 3 2 1 2 3 4 3 2 1 5 4 1 2 3 2 2 1.
Here the longest Wavio sequence is : 1 2 3 4 5 4 3 2 1. So, the output will be9.
Input
The input file contains less than 75 test cases. The description of each test case is given below: Input is terminated by end of file.
Each set starts with a postive integer, N(1<=N<=10000). In next few lines there will beN integers.
Output
For each set of input print the length of longest wavio sequence in a line.
Sample Input Output for Sample Input
10
1 2 3 4 5 4 3 2 1 10
19
1 2 3 2 1 2 3 4 3 2 1 5 4 1 2 3 2 2 1
5
1 2 3 4 5
9
9
1
Problemsetter: Md. Kamruzzaman, Member of Elite Problemsetters' Panel
经典的最长上升子序列的变形题
必须用nlogn的解法,这个类似单调队列的做法严格上来说已经不是dp了
容易想到枚举个位置作为“浪尖”,从前往后扫一遍,求最大的#include <cstdio>#include <iostream>#include <algorithm>#include <vector>using namespace std;int num[10005],increase[10005],decrease[10005];vector <int> vi(10000),vd(10000);vector <int>::iterator it;int main(){ int n; while(scanf("%d",&n) != EOF){ vi.clear();vd.clear(); int top; for(int i = 0;i < n;i++) cin >> num[i]; //先算一遍最长上升序列 vi.push_back(num[0]); increase[0] = 1; top = 0; for(int i = 1;i < n;i++){ if(num[i] > vi[top]){ top++; vi.push_back(num[i]); } else{ it = lower_bound(vi.begin(),vi.end(),num[i]); *it = num[i]; } increase[i] = top+1; } //再倒着算一遍上升序列,即正着的下降序列 vd.push_back(num[n-1]); decrease[n-1] = 1; top = 0; for(int i = n-2;i >= 0;i--){ if(num[i] > vd[top]){ top++; vd.push_back(num[i]); } else{ it = lower_bound(vd.begin(),vd.end(),num[i]); *it = num[i]; } decrease[i] = top+1; } //然后从左到右扫一遍,看以哪个位置为“浪尖”,浪波序列最长 int ans = 1,tem; for(int i = 0;i < n;i++){ tem = min(increase[i],decrease[i]); ans = max(tem*2-1,ans); } cout << ans << endl; } return 0;}
- 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,4级)
- UVA 10534 Wavio Sequence(dp + LIS)
- UVA 10534 - Wavio Sequence(经典dp)
- UVA - 10534 Wavio Sequence LIS 二分+DP
- UVA 10534--Wavio Sequence+二分+DP
- UVA 10534 Wavio Sequence DP(LIS+二分)
- uva 10534 Wavio Sequence
- UVA 10534 Wavio Sequence
- UVA 10534 - Wavio Sequence
- uva 10534 Wavio Sequence
- Uva-10534-Wavio Sequence
- UVa 10534 - Wavio Sequence
- uva 10534 - Wavio Sequence
- UVa 10534 - Wavio Sequence
- 如何判断栈的增长方向?
- 【QTP】引入自动化测试的原则[摘抄]
- setTag()/getTag()
- 基于stm32的usb iap程序升级步骤
- apk反编译问题总结
- uva 10534 - Wavio Sequence (dp)
- 使用数据库自增特性生成全局唯一id
- 尾数定价,你中招了吗
- Mysql 修饰符
- 新的开始——数组
- Dedecms数据库结构表名地址
- Wireshark 数据包解读实例
- linux shell grep的用法
- 【IPC通信】基于管道的popen和pclose函数