题意:给定一个长度为n的序列, 要求一个最长的Wavio Sequence, 使得前n+1为严格递增, 后n+1为严格递减
分析:可转化为经典的lis求解,分别对原字符串和反转后的字符串进行最长上升子序列求解,答案进行枚举即可 // ans = max(ans, min(dp1[i], dp2[n-i+1])*2 - 1);
注意点:题目范围为n <= 10000. 故需采用nlogn的求解方法
#include
#include
using namespace std;
const int maxn = 10010;
const int inf = 9999999;
int dp1[maxn], dp2[maxn], tmp[maxn];
int n, a[maxn];
int main() {
while(scanf("%d", &n) == 1) {
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
for(int i=1; i<=n; i++)
tmp[i] = inf;
for(int i=1; i<=n; i++) {
int k = lower_bound(tmp+1, tmp+n+1, a[i]) - tmp;
tmp[k] = a[i];
dp1[i] = k;
}
reverse(a+1, a+n+1);
for(int i=1; i<=n; i++)
tmp[i] = inf;
for(int i=1; i<=n; i++) {
int k = lower_bound(tmp+1, tmp+n+1, a[i]) - tmp;
tmp[k] = a[i];
dp2[i] = k;
}
int ans = 0;
for(int i=1; i<=n; i++)
ans = max(ans, min(dp1[i], dp2[n-i+1])*2 - 1);
printf("%d\n", ans);
}
return 0;
}