洛谷 P1091合唱队列

吾王剑之所指,吾等心之所向                           ——《Fate/stay night》

题目:https://www.luogu.org/problem/P1091

这题应该来说,是一道比较经典,也比较简单的动规题。

它的模板性质也很明显——

就是最长上升子序列

所以应该会动规的看见那个T1<T2<...<Ti>Ti+1>...>Tk就知道了吧

那这题还要考虑一点点,出去的最少,就意味着留下的最多,

那么LIS实锤:

只要把每个点为首的 的向左的最长下降子序列以及它 的向右的最长上升子序列 都求出来,然后相加,就是它为中央的留下的最多人数了。

好了,上代码:

#include<bits/stdc++.h>
using namespace std;
int n,maxn=0;
int a[105];
int f[105][4];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) 
    {
        scanf("%d",&a[i]);
        f[i][1]=f[i][2]=1;
    }
    
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {
            if(a[i]>a[j]&&f[j][1]>=f[i][1])
            {
                f[i][1]=f[j][1]+1;
            } 
        }
    }
    for(int i=n-1;i>=1;i--)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(a[i]>a[j]&&f[j][2]>=f[i][2])
            {
                f[i][2]=f[j][2]+1;
            }
        }
    }//求最长上升子序列和最长下降子序列
    
    for(int i=1;i<=n;i++)
    {
        f[i][3]=f[i][1]+f[i][2]-1;
        if(f[i][3]>maxn)
            maxn=f[i][3];//这是保留的人数 
    }
    printf("%d\n",n-maxn);//n-maxn是踢掉的人数 
    return 0;
}

我最开始输出的是maxn,结果就过了两个点

还是那句话——

细节决定成败啊!!!!!

猜你喜欢

转载自www.cnblogs.com/fjnhyzcrx-Mayuri/p/11525133.html