绝对差异的最大总和动态编程

时间:2017-10-28 23:29:06

标签: java arrays algorithm recursion dynamic-programming

我们有一组N个元素。我必须从这个数组中选择K元素(你不能采用索引大于下一个元素的索引的元素),使得总和abs(a1-a0)+abs(a2-a1)+...+(ak-ak-1)是最大化。我的想法是2d DP并且如下所示:在采用n元素时采用k - 元素的解决方案是索引j小于的元素的解决方案的最大值i是最后一个,j  来自k-1j<i加上abs(numbers[n]-numbers[j])。这是我的代码。我的错误在哪里?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class SumOfAbsoluteDifferences {

    static int solve(int numbers[], int N, int K) {
        int[][] dp = new int[N][K];
        for (int i=0; i<N; i++) {
            for (int j=0; j<K; j++)
                dp[i][j] = 0;
        }

        int E = 1;

        for (int i=0; i<N; i++) {
            int maxx = -99999;

            for (int j=E-1; j<i; j++) {

                    if (dp[j][E-1] + Math.abs(numbers[i] - numbers[j]) > maxx) {
                        maxx = dp[j][E-1] + Math.abs(numbers[i] - numbers[j]);
                    }

            }
            if(E < K && E-1>=0) {
                dp[i][E-1] = maxx;
                E++;
            }

        }

        int maks = -9999;
        for (int i=0; i<N; i++) {
            if (dp[i][K-1] > maks)
                maks = dp[i][K-1];
        }
        return maks;
    }

    public static void main(String[] args) throws Exception {
        int i,j,k;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        int numbers[] = new int[N];

        st = new StringTokenizer(br.readLine());
        for (i=0;i<N;i++) {
            numbers[i] = Integer.parseInt(st.nextToken());
        }

        int res = solve(numbers, N, K);
        System.out.println(res);

        br.close();

    }

}

例如这个测试用例:

  

10 3 1 9 2 3 6 1 3 2 1 3

我的代码为0,应为16。

0 个答案:

没有答案