034合唱隊形(最長上升子序列 DP做法)
阿新 • • 發佈:2021-02-02
題目描述:
N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設K位同學從左到右依次編號為1,2…,K,他們的身高分別為T1,T2,…,TK,
則他們的身高滿足T1<…<Ti>Ti+1>…>TK(1≤i≤K)
。
你的任務是,已知所有N位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。輸入格式:
輸入的第一行是一個整數N,表示同學的總數。 第二行有n個整數,用空格分隔,第i個整數Ti是第i位同學的身高(釐米)。
輸出格式:
輸出包括一行,這一行只包含一個整數,就是最少需要幾位同學出列。
資料範圍:
2≤N≤100,
130≤Ti≤230輸入樣例:
8
186 186 150 200 160 130 197 220輸出樣例:
4
import java.util.Scanner;
public class Main{
static int N = 110;
static int n;
static int[] h = new int[N];
static int[] f = new int[N];//最長上升子序列
static int[] g = new int[N];//最長下降子序列
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
n = read.nextInt();
for(int i = 1; i <= n;i++) h[i] = read.nextInt();
for(int i = 1; i <= n;i++) {
f[i] = 1;
for(int j = 1; j < i; j++) {
if(h[j] < h[i]) f[i] = Math.max(f[i],f[j] + 1);
}
}
for(int i = n; i > 0;i--) {
g[i] = 1;
for(int j = n; j > i; j--) {
if(h[j] < h[i]) g[i] = Math.max(g[i], g[j]+1);
}
}
int res = 0;
for(int k = 1; k <= n; k++) {
res = Math.max(res, f[k]+g[k] -1);
}
System.out.println(n - res);
}
}