经典DP题,f[i][j] 表示在前i个数字中插入j个乘号时的最大乘积,num[i][j]表示从第i个字符到第j个字符之间的数字,i从0开始
状态转移方程:f[i][j]=max(f[k][j-1]*num[k][i-1]),1<=k
#include <iostream>
#include <iomanip>
#include <cstring>
#include <algorithm>
using namespace std;
char str[41];
long long num[41][41],f[41][7];
int n,k,lenstr;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>k>>str;
lenstr=strlen(str);
for(int i=0;i<lenstr;i++)
{
num[i][i]=str[i]-'0';
for(int j=i+1;j<lenstr;j++)
num[i][j]=num[i][j-1]*10+str[j]-'0';
}
for(int i=1;i<=lenstr;i++)
f[i][0]=num[0][i-1];
for(int i=1;i<=lenstr;i++)
for(int j=1;j<=i-1&&j<=k;j++)
for(int k1=1;k1<i;k1++)
if(k1>j-1)
f[i][j]=max(f[i][j],f[k1][j-1]*num[k1][i-1]);
cout<<f[lenstr][k]<<endl;
return 0;
}

924

被折叠的 条评论
为什么被折叠?



