乘积最大
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串:312, 当N=3,K=1时会有以下两种分法:
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是:31*2=62
现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。
对于每组测试数据有两行:
第一行共有2个自然数N,K(6≤N≤40,1≤K≤6)
第二行是一个长度为N的数字串。
1231
——————————————————————————————————
题目的意思是把长度为n的数字中插入k和*,使积最大
dfs找暴力枚举*位置,数字较大,java大数运算
import java.math.BigInteger;
import java.util.Scanner; public class Main { static int n;
static int m;
static BigInteger r,r1,ans;
static BigInteger r2=new BigInteger("10");
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
n=cin.nextInt();
m=cin.nextInt();
r=cin.nextBigInteger();
ans=new BigInteger("-999");
dfs(0,0,new BigInteger("0"),new BigInteger("0"));
System.out.println(ans);
} }
public static void dfs(int cur,int k,BigInteger num,BigInteger temp)
{
if(cur==n)
{
if(temp!=new BigInteger("0"))
num=num.multiply(temp);
if(k==2)
{
ans=ans.max(num);
}
return;
}
char c=r.toString().toCharArray()[cur];
int t=c-'0';
long a=Integer.valueOf(t);
BigInteger r3=BigInteger.valueOf(a); dfs(cur+1,k,num,temp.multiply(r2).add(r3));
if(k!=0)
dfs(cur+1,k+1,num.multiply(temp),r3);
else dfs(cur+1,k+1,temp,r3); } }