1. 题目描述:
P1091 [NOIP2004 提高组] 合唱队形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
2. 题目分析:
翻译成(人话):有一个数列,找出一个位置,使他左边为上升子序列,右边为下降子序列
3. 思路:
我们可以枚举每一个数,计算出他左边最长上升子序列,右边最长下降子序列
为了方便写代码,我们可以都写成最长上升子序列:一个从左向右,一个从右向左
最后,枚举每一个数,将他最长上升子序列+最长子序列长度,找出最大值
最长上升子序列模板解释:【模板代码】最长上升子序列模板-优快云博客
4. 代码
#include<bits/stdc++.h>
using namespace std;
int t[105],maxx=-1;
int f1[105],f2[105];
int s[105];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t[i];
}
for(int i=1;i<=n;i++)
{
f1[i]=1;
for(int j=1;j<=i-1;j++)
{
if(t[j]<t[i])
{
f1[i]=max(f1[i],f1[j]+1);
}
}
}
for(int i=n;i>=1;i--)
{
f2[i]=1;
for(int j=n;j>=i-1;j--)
{
if(t[j]<t[i])
{
f2[i]=max(f2[i],f2[j]+1);
}
}
}
for(int i=1;i<=n;i++)
{
s[i]=f1[i]+f2[i]-1;
if(s[i]>maxx)
{
maxx=s[i];
}
}
cout<<n-maxx;
return 0;
}