UVA - 10534 Wavio Sequence

来源:互联网 发布:seo文章编辑器 编辑:程序博客网 时间:2024/05/29 09:00

题目大意:给出一个字符串, 找出一个奇数的子序列,子序列的前版部分要递增, 后半部分要递减, 且递增和递减的长度要相等, 要求输出最长满足条件的子序列的长度。


解题思路:题目可以转化成求字符串的最长递增子序列, 正向求一遍, 反向求一遍, 然后将相应位置的最长值取最小的进行比较(min(a[i], b[n - i - 1]), 因为要求递增部分和递减部分的长度要求相等, 但是长的部分可以取短, 所以取两边最小的),找出最大的Max, 输出 2 * Max - 1(去除中点)。

#include <cstdio>#include <algorithm>using namespace std;int main() {int n;while (scanf("%d", &n) != EOF) {int DP[2][10050] = {0},A[10050], F[20050] = {0},MAX = 0, MAX1 = 0, MAX2 = 0;for (int i = 1; i <= n; i++) {scanf("%d", &A[i]);int x = lower_bound(F+1, F+MAX1+1, A[i]) - F;MAX1 = max(MAX1, x);F[x] = A[i];DP[0][i] = x;}for (int i = n; i >= 1; i--) {int x = lower_bound(F+1, F+MAX2+1, A[i]) - F;MAX2 = max(MAX2, x);F[x] = A[i];DP[1][i] = x;}for (int i = 1; i <= n; i++)MAX = max(MAX, min(DP[0][i], DP[1][i]));printf("%d\n", MAX * 2 - 1);} return 0;}


0 0
原创粉丝点击