版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/amazingcode/article/details/79680395
给一个长度为 nn 的数字串,只包含数字0-9
,现在让你在这个串中间插入 k 个乘号,将数字串分为 k+1个部分,使得这 k+1个数字的乘积最大。比如数字串为"312"
,k=1 的时候有 2 种插入方法。3∗12=36和 31∗2=62,所以答案为 62。
试编程求解"98712365409451502137"
中插入 10个乘号的最大乘积。注意答案超过了 int 的范围,需要用到 long long 类型。由于结果太大,使用 Java 的同学建议用字符串的方式输出。
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=50;
char s[maxn];
long long ans[maxn][15];
int n,k;
long long change(int x,int y)
{
long long ret=0;
for(int i=x;i<=y;i++)
{
ret=ret*10+(s[i]-'0');
}
return ret;
}
void dp()
{
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
for(int m=1;m<=j;m++)
if(ans[m][i-1]*change(m+1,j)>ans[j][i])
ans[j][i]=ans[m][i-1]*change(m+1,j);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
cin>>s[i];
ans[i][0]=change(1,i);
}
dp();
printf("%lld\n",ans[n][k]);
return 0;
}