题意:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大
分析:根据题意很容易想到这个状态,F[i][j] 表示 在前i个数中插入j个乘号的最大值。
F[i][ j] = max{F[i-1][j-1]*val[i][i], F[i-2][j-1]*val[i-1][i], F[i-3][j-1]*val[i-2][i],···, F[j][j-1]*val[j+1][i]}
(1<=i<=n , 1<=j<=k)
边界:
F[i][0] =val[1][i]; 0个乘号时的最大值就是本身。
import java.math.*;
import java.util.*;
import java.io.*;
public class Main {
Scanner cin=new Scanner(new BufferedInputStream(System.in));
BigInteger f[][] = new BigInteger[41][7];
BigInteger val[][] = new BigInteger[41][41];
public void solve()
{
while(cin.hasNext())
{
int n,k;
String s;
n=cin.nextInt();
k=cin.nextInt();
s=cin.next();
for(int i=0;i<n;i++)
{
val[i][i] = BigInteger.valueOf(s.charAt(i)-'0');
for(int j=i+1;j<n;j++)
{
val[i][j] = val[i][j-1].multiply(BigInteger.valueOf(10)).add( BigInteger.valueOf(s.charAt(j)-'0') );
}
}
for(int i=0;i<n;i++)
{
f[i][0] = val[0][i];
for(int j=1;j<=i && j<=k; j++ )
{
f[i][j]=BigInteger.ZERO;
for(int l=j-1; l<i;l++)
{
f[i][j] = f[i][j].max(f[l][j-1].multiply(val[l+1][i]));
}
}
}
System.out.println(f[n-1][k]);
}
}
public static void main(String[] args){
Main text = new Main();
text.solve();
//System.out.println("heihei--------------------");
}
}