【问题标题】:Longest Convex Subsequence最长凸子序列
【发布时间】:2016-10-28 17:23:44
【问题描述】:

注意,我已经看过这个解决方案:Longest convex subsequence in an array

我已经查看了上面的解决方案,但我无法理解。我所知道的是凸子序列的属性是:

c[i] < (c[i-1] + c[i+1]) / 2

所以给定输入:2082 0 24719 1 383 4 20029 9 3781 16

解决方案将是:2082 0 1 4 9 16

现在,我提出的解决方案是 O(n3)

public static int max(int... i){
    int max = 0;
    for(int n : i){
        if(n > max)
            max = n;
    }
    return max;
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();

    int[] arr = new int[n];
    for(int i = 0; i < n; ++i)
        arr[i] = in.nextInt();

    int[][][] LCS = new int[n][n][n];
    for(int i = 0; i < n; i++){
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                LCS[i][j][k] = 0;
            }
        }

    }
    for(int i = 0; i < arr.length-2; ++i){
        for(int j=1; j < arr.length-1;++j){
            for(int k = 2; k < arr.length; ++k){
                if(arr[j] < (arr[i]+arr[k])/2){
                     LCS[i][j][k] = max(LCS[i][j][k], 1+ LCS[i][j][k-1]);
                }
            }
        }
    }
    int max = 0;
    for(int i = 0; i < n; ++i) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                if(LCS[i][j][k] > max)
                    max = LCS[i][j][k];
            }
        }

    }
    System.out.println(max);
}

我知道这完全是幼稚的,但我觉得我在正确的轨道上,我不知道为什么,但我一直得到一个 8 的序列作为答案。任何帮助,将不胜感激。

【问题讨论】:

    标签: java dynamic-programming


    【解决方案1】:

    Memoization 中的查找表应该是一个二维数组。 下面的解决方案也是 O(n3)。任何大小为 2 或更小的序列也是凸子序列。因此,沿着表格中的对角线,它将被 2 填充。

    import java.util.Scanner;
    
    public class LongestConvexSubSequence {
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        int length = in.nextInt();
        //System.out.println(length);
        int[] array = new int[length];
        for(int i=0; i<length; i++)
            array[i] = in.nextInt();    
    
    
    
        System.out.println("Max = "+ longestConvex(array, length) );
    }
    
    public static int longestConvex(int[] array, int  n){
        if(n<=2)
            return n;
    
        int max = 0;
        int[][] B = new int[n][n];
        B[0][0] = 1;
    
        for(int i=1; i<n; i++){
            for(int j=0; j<n; j++){
                B[i][j] = 2;
                for(int k=0; k<j; k++){
                    if(B[j][k]+ 1 >B[i][j] && ((array[i] - array[j]) > (array[j] - array[k])))
                        B[i][j] = B[j][k] + 1;
                }
                max = Math.max(max, B[i][j]);
            }
        }
    
        return max;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 2019-08-15
      • 2017-02-25
      • 2011-03-06
      • 2016-04-11
      • 2013-08-12
      • 2013-07-03
      • 2011-03-01
      相关资源
      最近更新 更多