题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
//两次递归,从左到右递归每一个节点的左侧最大值
//从右到左递归每一个节点的右侧最大值
#include <iostream>
#include<vector>
using namespace std;
int main() {
int n;
while (cin >> n) { // 注意 while 处理多个 case
int rdp[3001];//存储每个节点的左侧dp,这里r和l写反了,只能将错就错了
int ldp[3001];//存储每个节点的右侧dp
int a[3001];//储存身高信息
for(int i=1;i<=n;i++)
{
cin>>a[i];
rdp[i]=1;//初始化自身在队情况
ldp[i]=1;
for(int j=1;j<i;j++)//rdp,左侧递归求解每个节点作为中间节点时的左侧最大值
{
if((a[j]<a[i])&&(rdp[j]+1)>rdp[i])
{
rdp[i]=rdp[j]+1;
}
}
}
for(int i=n;i>=1;i--)//ldp,类似上
{
for(int j=n;j>i;j--)
{
if((a[j]<a[i])&&(ldp[j]+1)>ldp[i])
{
ldp[i]=ldp[j]+1;
}
}
}
int max=0;
//最终结果max为每个节点的左侧最大值(含自己作为中间)+右侧最大值(含自己作为中间)
//因为包含两次自己,所以最后结果max=max-1;
//答案输出n-max
for(int i=1;i<=n;i++)
{
if(ldp[i]+rdp[i]-1>max)
{
max=ldp[i]+rdp[i]-1;
}
}
cout<<n-max<<endl;
}
}
// 64 位输出请用 printf("%lld")
查看20道真题和解析
