分析:
涉及到最长上升子序列和最长下降子序列的问题。
首先设以第i个人为中间的Ti,则求出从前往后到第i个人的最长上升子序列,然后求出从第i个人到最后一个人的最长下降子序列。得到的总长度为最长的合唱队长队。
最长上升自序列的算法:
对于原始数组org[];new一个新的数组result[],用来存储原始数组里每一个元素的最长上升子序列的长度。对于i每一个元素来说,自己一定是自己的子集,所以初始化为1.首先对任意一个元素org[i]而言,在org[0]~org[i]中寻找最长的上升子序列。如果在这段数据中,org[j]的最长上升子序列的长度为result[j],org[i]的最长公共子序列一定包括org[j]的{最长上升子序列,org[i]},所以长度为org[j]+1.
最长下降子序列的思路与上面相似。
package com.whu.wsy;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int [] height = new int[num];
int [] heightUp = new int[num];
int [] heightDown = new int[num];
int t = 0;
for (int i = 0; i < num; i++) {
height[i] = scanner.nextInt();
}
ListUp(height, heightUp);
ListDown(height, heightDown);
for (int i = 0; i < num; i++) {
if (t < heightDown[i] + heightUp[i]) {
t = heightDown[i] + heightUp[i];
}
}
System.out.println(num - t +1);
}
private static void ListDown(int[] org, int[] result) {
// TODO Auto-generated method stub
int N = org.length;
for (int i = 0; i < N; i++) {
result[i] = 1;//初始化时对每一个元素而言,自己的最长升序子序列的个数都只有一个
}
for (int i = N-2; i >1 ; i--) {
for (int j = N-1; j > i; j--) {
if (org[i]>org[j] && result[i] < result[j]+1) {
result[i] = result[j] + 1;
}
}
}
}
private static void ListUp(int[] org, int[] result) {
// TODO Auto-generated method stub
int N = org.length;
for (int i = 0; i < N; i++) {
result[i] = 1;//初始化时对每一个元素而言,自己的最长升序子序列的个数都只有一个
}
for (int i = 1; i < N; i++) {
for (int j = 0; j < i; j++) {
if (org[i]>org[j] && result[i] < result[j]+1) {
result[i] = result[j] + 1;
}
}
}
}
}