設有一個長度爲N的數字串,要求選手使用K個乘號將它分成K+1個部分,找出一種分法,使得這K+1個部分的乘積能夠爲最大。
同時,爲了幫助選手能夠正確理解題意,主持人還舉了如下的一個例子:
有一個數字串:312, 當N=3,K=1時會有以下兩種分法:
3*12=36
31*2=62
這時,符合題目要求的結果是:31*2=62
現在,請你幫助你的好朋友XZ設計一個程序,求得正確的答案。
第一行共有2個自然數N,K(6≤N≤40,1≤K≤6)
第二行是一個長度爲N的數字串。
1231
import java.util.Scanner;
public class Main {
static int n, k;
static int[] used;
static int[] carr;
static int[] iarr;
static int[] tarr;
static int max = Integer.MIN_VALUE;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String[] sarr = scanner.nextLine().split(" ");
n = Integer.parseInt(sarr[0]);
k = Integer.parseInt(sarr[1]);
String s = scanner.nextLine();
tarr = new int[n];
for (int i = 0; i < n; i++) {
tarr[i] = s.charAt(i) - '0';
}
carr = new int[2];
carr[0] = 1;
carr[1] = 0;
used = new int[2];
used[0] = k;
used[1] = n - 1 - k;
// tag = new int[n - 1];
iarr = new int[n - 1];
// System.out.println("不重複的排列:");
dfs(0);
System.out.println(max);
}
static int ana(String string) {
String[] sarr = string.split(" ");
int tmp = 1;
for (int i = 0; i < sarr.length; i++) {
tmp *= Integer.parseInt(sarr[i]);
}
// System.out.println(string + "\n" + tmp);
return tmp;
}
static void dfs(int p) {
if (p == iarr.length) {
// find
String string = "";
string += tarr[0];
for (int i = 0; i < iarr.length; i++) {
if (iarr[i] == 1) {
string += " " + tarr[i + 1];
} else {
string += "" + tarr[i + 1];
}
}
int tmp = ana(string);
if (tmp > max) {
max = tmp;
}
} else {
for (int i = 0; i < used.length; i++) {
if (used[i] > 0) {
used[i]--;
iarr[p] = carr[i];
dfs(p + 1);
used[i]++;
}
}
}
}
}