题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
#include <iostream> #include <vector> using namespace std; class Solution{ public: int min_exclude(vector<int> &data, int N){ vector<int> dpl(N+1, 0); vector<int> dpr(N+1, 0); // 左边最大增序列长度 for (int i = 1; i <= N; i++){ // 左边所有小于当前i身高的最大增序列长度当中的最大值+1 for (int j = 1; j < i; j++){ if (data[i] > data[j]) dpl[i] = max(dpl[i], dpl[j]); } dpl[i] ++; // i=1则为1 } // 右边最大减序列长度 for (int i = N; i >= 1; i--){ for (int j = N; j > i; j--){ if (data[i] > data[j]) dpr[i] = max(dpr[i], dpr[j]); } dpr[i] ++; } // 找最大值 int max_len = 0; for (int i = 1; i <= N; i++) max_len = max(max_len, dpl[i]+dpr[i]-1); //包括了自己,所以要减掉重复的一次 return N - max_len; } }; int main() { int N; cin >> N; vector<int> data(N+1, 0); for (int i = 1; i <= N; i++){ cin >> data[i]; } Solution res; cout << res.min_exclude(data, N) << endl; return 0; }
主要是太难想到这一层,依托于最大序列