我的动态编程代码在java中以更优化的方式编写

puruo6ea  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(272)

我写了一个密码 Reversing a subarray to maximize sum of even-indexed elements of given array ```
public static int max_reverse_sub(int a[]){

    int a_len = a.length;
    int b[][] = new int[a_len][a_len];
    int custom_sum = 0;
    for(int k = 0 ; k < a.length ; k = k + 2){

        custom_sum  = custom_sum + a[k];

    }
    int i = 0;
    int j = 0;
    int i_keep = 0;
    int j_keep = 0;
    int max = Integer.MIN_VALUE;
    for(i = 0 ; i < a_len ; i++){

        for(j = i ; j < a_len ; j++){

        if(b[i][j] == 0){

        if(i == j){
            b[i][j] = custom_sum;
        }
        else{

            if((j - i) % 2 == 0){
                b[i][j] = Math.max(b[i][j - 1], b[i + 1][j]);

            }
            else{
                int m1= Math.max(b[i][j - 1], b[i + 1][j]);
                b[i][j] = Math.max(m1 , first_to_end(a, i, j, custom_sum));

            }
        }
    }
            if(b[i][j] > max)
                max = b[i][j];

        }

    }
    return max;

}
数组 `b[][]` 是我的 `dp` .  `b[i][j]` is元素 `i` 至 `j` 选择倒车。它工作,但不是在最佳时间。我还写了一个 `max_reverse_sub` 名为的方法 `first_to_end` 如下所示。

public static int first_to_end(int a[] , int i , int j , int sum){

    int keep = sum;
    for(int k = i ; k <= j ; k++){

        if(k % 2 == 0){

            keep = keep - a[k];
        }
        else{

            keep = keep + a[k];
        }

    }
    if(keep > sum)
        return keep;
    return sum;

}
它计算新的 `i` 至 `j` 元素if `j - i` 是 `odd` 因为我们得到了一个新的总和,当它反向。我认为我的问题是使用这种方法,因为它在 `o(n)` 当我在我的方法中使用它时 `o(n^3)` .
下面是一个更好的例子:

Input: arr[] = {1, 2, 1, 2, 1}
Output: 5
Explanation:
Sum of intial even-indexed elements = a[0] + a[2] + a[4] = 1 + 1 + 1 = 3
Reversing subarray {1, 2, 1, 2} modifies the array to {2, 1, 2, 1, 1}.
Hence, the maximized sum = 2 + 2 + 1 = 5

你能找到解决问题的办法吗 `Dp` 在o(n^2)或更好的时间找到它?如果你有什么问题可以问我。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题