动态规划- 26. 内积

2020-05-31 18:00:06

问题描述:

给定长度为N的A数组,长度为K的BB数组
你可以从A数组里取K个数
规则如下,
每次可以从A数组的最左边或者最右边取走一个数,取走的数从数组中移除

将取出的A_iAi​​按取出的顺序 组成C数组
BC的内积最大值

问题求解:

主要难点在于状态的定义,可以将状态定位为dp[i][j] : 从A数组左侧取了i个数,右侧取了j个数得到的最大值。

    long[][] dp;
    public long getMaxInnerProduct(int[] A, int[] B) {
        int len1 = A.length;
        int len2 = B.length;
        dp = new long[len2 + 1][len2 + 1];
        for (int i = 0; i <= len2; i++) {
            for (int j = 0; j <= len2; j++) {
                if (i == 0 && j == 0) continue;
                if (i + j > len2) continue;
                if (i + j > len1) continue;
                if (i == 0) dp[i][j] = dp[i][j - 1] + (long)A[len1 - j] * B[i + j - 1];
                else if (j == 0) dp[i][j] = dp[i - 1][j] + (long)A[i - 1] * B[i + j - 1];
                else dp[i][j] = Math.max(dp[i - 1][j] + (long)A[i - 1] * B[i + j - 1], dp[i][j - 1] + (long)A[len1 - j] * B[i + j - 1]);
            }
        }
        long res = 0;
        for (int i = 0; i <= len2; i++) res = Math.max(res, dp[i][len2 - i]);
        return res;
    }

  

原文地址:https://www.cnblogs.com/hyserendipity/p/13020271.html