题解
这道题有点意思,是一道有点变化的dp。这题的基础是那道最长递增序列。
简单的解题想法是对表中每位考虑 从左到此 最长序列多少,从此到右 最长序列多少。最后相加取最大值即可。
代码
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int n;
int cot[101],f[2][101];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>cot[i];
for(int i=1;i<=n;i++)// 赋初值
f[0][i]=f[1][i] = 1;
for(int i=1;i<=n;i++)// 顺序最长
for(int j=1;j<i;j++)
if(cot[i]>cot[j]) f[0][i] = max(f[0][i],f[0][j]+1);
for(int i=n;i>0;i--)// 逆序最长
for(int j=n;j>i;j--)
if(cot[i]>cot[j]) f[1][i] = max(f[1][i],f[1][j]+1);
int maxn=0;
for(int i=1;i<=n;i++){
maxn=max( maxn , f[0][i]+f[1][i]-1);
}
cout<< n - maxn<<endl;
}