1091 合唱队列
先看一眼数据范围,水的可怜
这个题也算是一个裸的线性DP吧
理解了好长时间都不太懂为什么要跑两个,再读一遍题就会明白了
他们的身高满足t1<…ti>ti+1>…tk
也就是一个山坡的形状,所以需要跑两个,最长上升子序列,最长下降子序列,然后维护最大值-1就好了,然后对于两个操作也是模板的,不过多解释
--------------重新---------------
n个同学,n-k出列,剩下的k排成一队

山峰型队列,这个之前初赛搞过,初赛挺好的
所以我们需要跑两个DP
一个是最长上升,一个最长下降,然后最后会有一个山峰ti重合,需要减去
然后我维护两个队列需要相加
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=300;
int a[N],b[N],c[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)//从左往右上升
{
b[i]=1;
for(int j=1;j<=i-1;j++)
{
if(a[i]>a[j]&&b[j]+1>b[i])//最长上升子序列
b[i]=b[j]+1;
}
}
for(int i=n;i>=1;i--)//从右往左下降
{
c[i]=1;
for(int j=i+1;j<=n;j++)
{
if(a[j]<a[i]&&c[j]+1>c[i])//最长下降子序列
c[i]=c[j]+1;
}
}
int maxx=0;
for(int i=1;i<=n;i++)
if(b[i]+c[i]>maxx)
maxx=b[i]+c[i];
cout<<n-(maxx-1)<<endl;
}
1091合唱队列解析
1176

被折叠的 条评论
为什么被折叠?



