本题的题意就是在一串数字中插入k个乘号,使分隔开的数字之间乘积最大,其实我们可以考虑这样一个关系,f(i,j)表示从0-i之间插入j个乘号所表示最大的值,那么边界就是当j=0时,f(i,j)就等于从0-i之间的值,所以我们可以得到:见代码:
#include<iostream>
#include<memory.h>
using namespace std;
int main(){
int n,k;
string str;
cin >> n>> k;
cin >> str;
int dp[41][7];//dp[i][j]表示在0-i数字中插入j个乘号
memset(dp,0,sizeof(dp));
int num[41][41];//num[i][j]表示取i到J之间的数字串的值
//计算num
for(int i=0;i<n;i++){
int tmp=0;
for(int j=i;j<n;j++){
tmp=tmp*10+str[j]-'0';
num[i][j]=tmp;//包含i,j
}
}
//当不插入乘号的时候,最大值为其本身
for(int i=0;i<n;i++){
dp[i][0]=num[0][i];
}
//动态转移方程
for(int i=0;i<n;i++){ //枚举数字位数
for(int j=1;j<=k;j++){ //枚举乘号的个数
for(int t=0;t<i;t++){ //枚举放乘号的位置
//dp[t][j-1]表示从在前t个数字中插入j-1个乘号的值*后面剩下的数字之积
dp[i][j]=max(dp[t][j-1]*num[t+1][i],dp[i][j]);
}
}
}
cout<<dp[n-1][k]<<endl;
return 0;
}