如果看不懂代码,详细解法见参考链接。
参考代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String[] arg=br.readLine().split(" ");
int n=Integer.parseInt(arg[0]);
int k=Integer.parseInt(arg[1]);
arg=br.readLine().split(" ");
int[] sum=new int[n+1];//前i个数之和
for(int i=1;i<=n;i++) {
sum[i]=sum[i-1]+Integer.parseInt(arg[i-1]);
}
long[][] dp=new long[n+1][k+1];//dp[i][j]表示前i个数中有j个乘号时,所得最大值
for(int i=1;i<=n;i++) {//没有乘号,即连加的情况
dp[i][0]=sum[i];
}
for(int i=2;i<=n;i++) {//前i个数
for(int j=1;j<i&&j<=k;j++) {//乘号的个数
for(int p=2;p<=i;p++) {//乘号的位置
//求有前i个数有j个乘号时的最大值
dp[i][j]=(dp[i][j]>=(dp[p-1][j-1]*(sum[i]-sum[p-1]))?dp[i][j]:(dp[p-1][j-1]*(sum[i]-sum[p-1])));
}
}
}
System.out.println(dp[n][k]);
}
}