--- tags: uva --- # Uva10534 - Wavio Sequence ## 題目大意 給一個序列,要我們找出前 (n-1) 是升序後面 (n-1)降序的最長子序列長度 ## 重點觀念 - LIS 參考 http://web.ntnu.edu.tw/~algo/Subsequence.html ## 分析 - 正反各做一次 LIS 記錄個 index 的 position - 最後再遍歷一遍找最大的 n*2+1 即是答案 ## 程式題目碼 ```cpp= #include <iostream> #include <vector> using namespace std; int main() { int n; while (cin >> n) { int a[n]; for (int i = 0; i < n; i++) { cin >> a[i]; } int lis[n]; // 紀錄左到右的 lis 位置 int lds[n]; // 紀錄左道揍的 lds 位置 vector<int> dp; dp.push_back(a[0]); for (int i = 0; i < n; i++) { if (a[i] > dp.back()) { lis[i] = dp.size(); dp.push_back(a[i]); } else { dp[lis[i] = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin()] = a[i]; } } dp.resize(0); dp.push_back(a[n - 1]); for (int i = n - 1; i >= 0; i--) { if (a[i] > dp.back()) { lds[i] = dp.size(); dp.push_back(a[i]); } else { lds[i] = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin(); dp[lds[i]] = a[i]; } } int ans = 0; for (int i = 0; i < n; i++) { ans = max(ans, min(lis[i], lds[i]) * 2 + 1); } cout << ans << endl; } return 0; } ```