区间dp,f[i][j]表示方用了i个乘号到第j位数字最大的乘积,最后输出f[k][n-1]
#include<iostream>
#include<string>
using namespace std;
string s;
long long man,f[41][41]={{0}},n,k;
long long cs(int ks,int js)//计算一段的值
{
long long sum=0,t=1;
for(int i=js;i>=ks;i--){sum=sum+(s[i]-'0')*t,t=t*10;}
return sum;
}
int main()
{
cin>>n>>k>>s;
for(int i=0;i<n;i++){f[0][i]=cs(0,i);}//边界,在没有乘号的情况下最优解总是前i位
for(int i=1;i<=k;i++)//i代表称号的个数
{
for(int j=1;j<=n;j++)//j代表第几位数字
{
for(int h=j;h>=i;h--)
{
f[i][j]=max(f[i][j],f[i-1][h-1]*cs(h,j));
}
}
}
cout<<f[k][n-1];//输出最优解
}