2020-05-31 18:00:06
问题描述:
给定长度为N的A数组,长度为K的BB数组
你可以从A数组里取K个数
规则如下,每次可以从A数组的最左边或者最右边取走一个数,取走的数从数组中移除
将取出的A_iAi按取出的顺序 组成C数组
求B与C的内积最大值
问题求解:
主要难点在于状态的定义,可以将状态定位为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; }