1. 程式人生 > >洛谷 P1091合唱隊列

洛谷 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,結果就過了兩個點

還是那句話——

細節決定成敗啊!!!!!<