问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大。因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号。例如: N=5,K=2,5个数字分别为1、2、3、4、5,可以加成: 1*2*(3+4+5)=24 1*(2+3)*(4+5)=45 (1*2+3)*(4+5)=45 …… 输入格式 输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行为 N个用空格隔开的数字(每个数字在0到9之间)。 输出格式 输出文件仅一行包含一个整数,表示要求的最大的结果 样例输入 5 2 1 2 3 4 5 样例输出 120 样例说明 (1+2+3)*4*5=120
AC代码如下:
import java.util.Scanner;
public class Main {
static int N;
static int Mul;
static long[] num = new long[20];
static long[] sum = new long[20];
static long[][] dp = new long[20][20];
/*
* dp[i][j]代表前i个数中有j个乘号的最大值
* sum[i]是前i个数的和
* 状态转移方程:dp[i][0] = sum[i]
* dp[i][j] = max(dp[i][j],dp[k-1][j-1]*(sum[i]-sum[j-1]))
* k为乘号的位置;
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
N= in.nextInt();
Mul = in.nextInt();
for ( int i = 0 ; i < 20 ; i++){
for ( int j = 0 ; j < 20 ; j++){
dp[i][j] = 0;
}
}
sum[0] = 0;
num[0] = 0;
for ( int i = 1 ; i <= N ; i++){
num[i] = in.nextLong();
sum[i] = sum[i-1] + num[i];
dp[i][0] = sum[i];
}
for ( int i = 2 ; i <= N ; i++){
int t = Math.min(i, Mul);
for ( int j = 1 ; j <= t ; j++){//j为乘号的个数
for ( int k = 2 ; k <= i ; k++){//k为乘号的位置
long tmp = sum[i]-sum[k-1];
dp[i][j] = Math.max(dp[i][j], dp[k-1][j-1]*tmp);
}
}
}
System.out.print(dp[N][Mul]);
in.close();
}
}