import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] A = new int[n];
int[] B = new int[n];
for (int i = 0; i < n; i++) {
A[i] = scanner.nextInt();
}
for (int i = 0; i < n; i++) {
B[i] = scanner.nextInt();
}
scanner.close();
int[][] dp = new int[n][n];
for (int left = 0; left < n; left++) {
int right = left;
int k = n - 1;
dp[left][right] = A[left] * B[k];
}
for (int len = 2; len <= n; len++) {
for (int left = 0; left <= n - len; left++) {
int right = left + len - 1;
int k = n - len;
int takeLeft = A[left] * B[k] + dp[left + 1][right];
int takeRight = A[right] * B[k] + dp[left][right - 1];
dp[left][right] = Math.max(takeLeft, takeRight);
}
}
System.out.println(dp[0][n - 1]);
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取输入的整数n以及数组A和B的元素。
- 初始化dp数组:处理所有长度为1的区间,直接计算对应的价值。
- 动态规划填表:按区间长度从小到大处理,计算每个区间[left, right]的最大价值。对于每个区间,分别计算从左端和右端取数的价值,取较大者。
- 输出结果:最终结果存储在dp[0][n-1]中,表示整个数组A的最大总价值。



京公网安备 11010502036488号