给定两个长度为 n 的整数列 A 和 B ,每次你可以从 A 数列的左端或右端取走一个数。假设第 i 次取走的数为 ,则第i次取走的数的价值 ,现在希望你求出 的最大值。
数据范围: ,
[1,1000],[2,1]
2001
[1,3,5,2,4],[1,2,3,4,5]
52
第一次从左边取走a1,v1=a1⋅b1=1,
第二次从左边取走a2,v2=a2⋅b2=6,
第三次从右边取走a5,v3=a5⋅b3=12,
第四次从右边取走a4,v4=a4⋅b4=8,
第五次取走剩下的a3,v5=a3⋅b5=25。
总价值∑vi=1+6+12+8+25=52
public int numbergame (ArrayList<Integer> A, ArrayList<Integer> B) { // write code here int[] a = A.stream().mapToInt(Integer::valueOf).toArray(); int[] b = B.stream().mapToInt(Integer::valueOf).toArray(); // dp[i][j]: 左边已经取走了i个数,右边取走了若干个数,总共已经取走了j个数,此时能获得的最高得分 // dp[i][j] = (取左边)dp[i+1][j+1] + a[i]*b[j], (取右边)dp[i][j+1] + a[]*b[j] int[][] dp = new int[a.length][b.length]; for(int i = 0; i < a.length; ++i) { dp[i][b.length-1] = a[i] * b[b.length-1]; } for(int i = a.length-2; i >= 0; --i) { for(int j = b.length-2; j >= i; --j) { dp[i][j] = Math.max(dp[i+1][j+1] + a[i]*b[j], dp[i][j+1] + a[a.length-j+i-1]*b[j]); } } return dp[0][0]; }