合唱队形(lgP1091)

思路:

先从左到右求一遍最长不下降子序列,再同样方法从右到左求一遍。

然后我们枚举分界点,则总人数就是左边一半加上右边一半的人数。

取最大值,输出答案。

见注释。

#include<bits/stdc++.h>
using namespace std;
int n,a[101],f1[101],f2[101],ans;
int main()
{
    cin>>n;
    for(int i = 1;i <= n;i ++) cin>>a[i];
    for(int i = 1;i <= n;i ++)//此处是从左到右求
    {
        for(int j = 0;j < i;j ++)
        {
            if(a[i] > a[j]) f1[i] = max(f1[i],f1[j] + 1);
        }
    }
    for(int i = n;i;i --)//从右到左求
    {
        for(int j = n + 1;j > i;j--)
        {
            if(a[i] > a[j]) f2[i] = max(f2[i],f2[j]+1);
        }
    }
    for(int i = 1;i <= n;i ++) ans = max(f1[i] + f2[i] - 1,ans);//枚举分界点并更新答案
    cout<<n-ans;
    return 0;
}

用时 25min  ,一遍过。

原文地址:https://www.cnblogs.com/ying-xue/p/14087915.html