华为OJ试题整理

华为OJ试题整理
1.合唱队
华为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;
                }
            }
        }

    }

}

你可能感兴趣的:(OJ)