2021寒假每日一題《合唱隊形》

合唱隊形

題目來源:NOIP2004提升組
時間限制:\(1000ms\) 內存限制:\(128mb\)java

題目描述

\(N\) 位同窗站成一排,音樂老師要請其中的 \((N-K)\) 位同窗出列,使得剩下的 \(K\) 位同窗排成合唱隊形。
合唱隊形是指這樣的一種隊形:設 \(K\) 位同窗從左到右依次編號爲 \(1,2…,K\) ,他們的身高分別爲 \(T_1,T_2,…,T_K\) ,則他們的身高知足 \(T_1<…<T_i>T_i+1>…>T_K (1≤i≤K)\)
你的任務是,已知全部 \(N\) 位同窗的身高,計算最少須要幾位同窗出列,能夠使得剩下的同窗排成合唱隊形。shell

輸入格式

輸入的第一行是一個整數 \(N\) ,表示同窗的總數。
第二行有 \(N\) 個整數,用空格分隔,第 \(i\) 個整數 \(T_i\) 是第 \(i\) 位同窗的身高(釐米)。spa

輸出格式

輸出包括一行,這一行只包含一個整數,就是最少須要幾位同窗出列。code

數據範圍

\(2 ≤N ≤ 100\) ,
\(130 ≤ T_i ≤ 230\)內存

樣例輸入

8
186 186 150 200 160 130 197 220

樣例輸出

4

解題思路

要使全部同窗的身高呈現出先遞增後遞減的格式,須要將中間比較 突出 的同窗請出列。
先設置一箇中間點,中間點將左右兩邊分開,只須要使左右兩邊分別剔除的同窗最少,再將左右兩邊相加便可。
因爲分紅了左右兩邊,因而只須要計算左邊的最長遞增子序列,右邊反過來的最長遞增子序列,而後把它們加起來就獲得了須要的同窗的數量。
而後用總數減去須要的同窗的數量就獲得了須要剔除的同窗的數量。input

解題代碼

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int[] t = new int[n];
        for (int i = 0; i < n; i++) {
            t[i] = input.nextInt();
        }
        input.close();

        int[] f = new int[n], g = new int[n];

        for (int i = 0; i < n; i++) {
            f[i] = 1;
            for (int j = 0; j < i; j++) {
                if (t[j] < t[i]) {
                    f[i] = Math.max(f[i], f[j] + 1);
                }
            }
        }

        for (int i = n - 1; i >= 0; i--) {
            g[i] = 1;
            for (int j = n - 1; j >= i; j--) {
                if (t[j] < t[i]) {
                    g[i] = Math.max(g[i], g[j] + 1);
                }
            }
        }

        int ans = 0;
        for (int k = 0; k < n; k++) {
            ans = Math.max(ans, f[k] + g[k] - 1);
        }

        System.out.println(n - ans);
    }
}
相關文章
相關標籤/搜索