1. 程式人生 > 其它 >034合唱隊形(最長上升子序列 DP做法)

034合唱隊形(最長上升子序列 DP做法)

技術標籤:演算法動態規劃java演算法

題目描述:

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); } }