设有一个长度N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串: 312,当N=3,K=1时会有以下两种分法:
1)3*12=36
2)31*2=62
这时,符合题目要求的结果是: 31*2=62
现在,请你设计一个程序,求得正确的答案。
程序的输入共有两行:
第一行共有2个自然数N,K (6<=N<=20,1<=K<=6)
第二行是一个K度为N的数字串。
62
//由于n,k都比较小,所有可以直接DFS,选择在某个位置插或不插入'*'号 ;
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
#define maxn 25
int n,k,ans;
char st[maxn];
bool vist[maxn];
void make_ans()
{
int sum=1,tmp=0,i;
for(i=0;i<n;i++)
{
if(!vist[i])
tmp=tmp*10+(st[i]-'0');
else
{
sum*=tmp;
tmp=st[i]-'0';
}
}
sum*=tmp;
if(sum>ans)
ans=sum;
}
void dfs(int id,int len)
{
int j;
if(len==k)
{
make_ans();
return;
}
for(j=id;j<n;j++)
if(!vist[j])
{
vist[j]=true;
dfs(j,len+1);
vist[j]=false;
}
}
int main()
{
scanf("%d%d",&n,&k);
memset(vist,false,sizeof(vist));
scanf("%s",st);
ans=0;
dfs(0,0);
printf("%d\n",ans);
return 0;
}