如 在847313926插入5个乘号,乘积最大为8*4*731* 3*9* 92*6
一般思路dp:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int n;
void show(long long c[][20],int r)
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<=r;j++)
{
printf("%12I64d",c[i][j]);
}
cout<<endl;
}
}
int main()
{
char ch[20];
int a[20];
int i,j,k;
int r;//插入乘号个数
long long f[20][20];
long long d;
while(1)
{
scanf("%s",ch);
scanf("%d",&r);
memset(f,0,sizeof(f));
n=strlen(ch);
if(n<=r)
{
cout<<"error"<<endl;
continue;
}
for(i=0;i<n;i++)
{
a[i+1]=(ch[i]-'0');
}
for(d=0,i=1;i<=n;i++)
{
d=d*10+a[i];
f[i][0]=d;
}
show(f,r);
int u;
for(k=1;k<=r;k++)//乘号个数,即列数,从1开始
for(i=k+1;i<=n;i++)//行数,从第二行开始
{
for(j=k;j<i;j++)//模拟新增的一个乘号所在位置j,范围[k,i)
{
for(d=0,u=j+1;u<=i;u++)
d=d*10+a[u];
if(f[i][k]<f[j][k-1]*d)
f[i][k]=f[j][k-1]*d;
}
}
show(f,r);
}
return 0;
}