您的位置:首页 > 其它

华为OJ试题整理

2016-04-12 16:57 357 查看
华为OJ试题整理

1.合唱队



分析:

涉及到最长上升子序列和最长下降子序列的问题。

首先设以第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;
}
}
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: