给定一个序列,求其中最长波动子序列
题解
据说这题可以动归,然而感觉动归爆炸,就贪了个心
正解是枚举所有的拐点,将拐点加入子序列中一定比加入其他点更优,因为拐点比可以容纳更多的点在其中波动,最后特判起点和终点是否可以加入序列中即可
代码
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> const int MAXN = 100000; int height[MAXN + 1]; int main () { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &height[i]); } bool isUping = true; int ans = 0; if (height[1] >= height[2]) isUping = false; else isUping = true; for (int i = 2; i <= n - 1; i++) { if (isUping && height[i] > height[i + 1]) { isUping = false; ans++; } else if (!isUping && height[i] < height[i + 1]) { isUping = true; ans++; } } if (height[1] == height[2]) ans--; if (height[n - 1] == height[n]) ans--; ans += 2; printf("%d\n", ans); return 0; }
|