题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> res;
for (int i = 0; i < N; i++) {
int n;
cin >> n;
res.push_back(n);
}
// for (vector<int>::iterator it = res.begin(); it != res.end(); ) { //去重
// if (count(res.begin(), res.end(), *it) != 1) {
// it = res.erase(it);
// } else {
// it++;
// }
// }
// vector<int> dp_up(res.size(), 1), dp_down(res.size(), 1);
// for(int i = 1, j = res.size()-2; i < res.size(); i++, j--)
// {
// for(int k = 0; k < i; k++)
// {
// if(res[i] > res[k])
// {
// if(dp_up[k] + 1 > dp_up[i])
// dp_up[i] = dp_up[k]+1;
// }
// }
// for(int k = res.size()-1; k > j; k--)
// {
// if(res[j] > res[k])
// {
// if(dp_down[k] + 1 > dp_down[i])
// dp_down[j] = dp_down[k]+1;
// }
// }
// }
// vector<int> dp(res.size(), 0);
// for(int i = 0; i < dp.size(); i++)
// {
// dp[i] = dp_up[i] + dp_down[i] - 1;
// }
// int ans = N-dp[0];
// for(int i : dp)
// {
// if(N-i < ans)
// ans = N-i;
// }
// 设置两个dp数组
int i, j, n = N;
vector<int>heights(res );
vector<int> dp_h(n, 1), dp_t(n, 1);
// 正序遍历
for (i = 0; i < n; i++) {
for (j = 0; j < i; j++) {
if (heights[i] > heights[j]) {
dp_h[i] = max(dp_h[i], dp_h[j] + 1);
}
}
}
// 逆序遍历
for (i = n - 1; i >= 0; i--) {
for (j = n - 1; j > i; j--) {
if (heights[i] > heights[j]) {
dp_t[i] = max(dp_t[i], dp_t[j] + 1);
}
}
}
// 求和得到最长先增后减子序列的长度
int maxNum = 0;
for (i = 0; i < n; i++) {
if (dp_t[i] + dp_h[i] - 1 > maxNum)
maxNum = dp_t[i] + dp_h[i] - 1;
}
// 输出
cout << n - maxNum << endl;
// cout << ans;
}
// 64 位输出请用 printf("%lld")

传音控股公司福利 360人发布