链接
知识点
动态规划,数论
思路
对于这样一个序列,假设下标 k(1 <k<n),在k之前,要使得序列非严格递增,在k十1之后,要使得序列非严格递减。要求最少删除次数,即求它的最大长度。
我们考虑求原序列的正向最长上升子序列和反向最长下降子序列,显然,对每一项的二者之和取最大值即为答案.。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n,a[N];
int dp1[N]; //表示以i结尾的最长非递减子序列
int dp2[N]; //表示以i结尾的最长非递减子序列
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
dp1[i] = dp2[i] = 1;
}
for(int i = 2; i <= n; i++){
for(int j = 1; j < i; j++){
if(a[i] >= a[j]){
dp1[i] = max(dp1[i],dp1[j] + 1);
}
}
}
for(int i = n - 1; i >= 1; i--){
for(int j = n; j > i; j --){
if(a[i] >= a[j]){
dp2[i] = max(dp2[i],dp2[j] + 1);
}
}
}
int m = 0;
for(int i = 1; i <= n; i++){
m = max(m,dp1[i] + dp2[i] - 1); //自己被算了两次,所以 - 1
}
cout << n - m <<endl;
return 0;
}