import java.math.BigInteger;
import java.util.Scanner;
/*给定n个1到9的数字,要求在数字之间摆放m个加号(加号两边必须有数字),
使得所得到的加法表达式的值最小,并输出该值。例如,在1234中摆放1个加号,
最好的摆法就是12+34,和为36
*/public class CalcMin {
static Scanner scanner = new Scanner(System.in);
static BigInteger INF = new BigInteger(“99999999999999999999999999999”);
static BigInteger[][] vals;
static String expression;
public static void main(String[] args) {
int m, n;
while (scanner.hasNext()) {
m = scanner.nextInt();
expression = scanner.next();
n = expression.length();
vals = new BigInteger[n+1][n+1];
precalc(n);
BigInteger val = calc2(m, n);
System.out.println(val);
}
}
//网上的做法,预计算,不过个人感觉有点难以理解
private static void precalc(int n) {
for(int i = 1;i <= n;i++)
{
for(int j = i;j <= n;j++)
{
vals[i][j] = new BigInteger(expression.substring(i-1, j));
}
}
}
//DP传统计算
private static BigInteger calcvals(int i, int n) {
if (!vals[i][n].equals(0)) {
vals[i][n] = new BigInteger(expression.substring(i-1, n));
}
return vals[i][n];
}
private static BigInteger calc(int m, int n) {
if (m == 0) {
return vals[m + 1][n];// [1][n]
}
if (m + 1 > n)
return INF;
BigInteger min = INF;
for (int i = m; i < n; i++)
min = min.min(calc(m - 1, i).add(vals[i + 1][n]));
return min;
}
private static BigInteger calc2(int m, int n) {
if (m == 0) {
return calcvals(m + 1,n);// [1][n]
}
if (m + 1 > n)
return INF;
BigInteger min = INF;
for (int i = m; i < n; i++)
min = min.min(calc(m - 1, i).add(calcvals(i + 1,n)));
return min;
}
}