写一个java程序,实现以下功能:有一个只有加法和乘法的算术式,假设你可以合法的任意加括号,请求出这个算术式能得到的最大值和最小值。参与运算的数字都是正整数,数字个数不超过10。每个数字的大小不超过10。输入时每个符号或数字间有一个空格
时间: 2023-01-17 12:46:03 浏览: 129
这是一个使用动态规划的 Java 程序,它可以实现你所请求的功能:
```
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
sc.close();
// 将字符串转换为数字和符号的数组
String[] arr = s.split(" ");
int n = arr.length;
int[] nums = new int[n];
char[] ops = new char[n - 1];
for (int i = 0; i < n; i++) {
if (i % 2 == 0) {
nums[i / 2] = Integer.parseInt(arr[i]);
} else {
ops[i / 2] = arr[i].charAt(0);
}
}
// 初始化 dp 数组
int[][] maxDp = new int[n][n];
int[][] minDp = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
maxDp[i][j] = Integer.MIN_VALUE;
minDp[i][j] = Integer.MAX_VALUE;
}
}
for (int i = 0; i < n; i++) {
maxDp[i][i] = nums[i];
minDp[i][i] = nums[i];
}
// 填充 dp 数组
for (int len = 2; len <= n; len++) {
for (int i = 0; i <= n - len; i++) {
int j = i + len - 1;
for (int k = i; k < j; k++) {
int a = maxDp[i][k];
int b = maxDp[k + 1][j];
int c = minDp[i][k];
int d = minDp[k + 1][j];
if (ops[k] == '+') {
maxDp[i][j] = Math.max(maxDp[i][j], a + b);
minDp[i][j] = Math.min(minDp[i][j], c + d);
} else if (ops[k] == '*') {
maxDp[i][j] = Math.max(maxDp[i][j], a * b);
minDp[i][j] = Math.min(minDp[i][j], c * d);
}
}
}
}
// 输出最大值和最小值
System.out.println("最
阅读全文