区间dp很经典的题
#include<bits/stdc++.h>
using namespace std;
int num[50][50];
int dp[50][10];
//dp[i][k]表示从0~i之间有K个乘号的乘积最大值
//dp[i][k] = max(dp[j][k-1]*num[j+1][i])(k<=j<=i-1)
int main()
{
int N,K,i,j;
string s;
cin>>N>>K;
cin>>s;
for(i=0;i<N;i++)
{
int temp=0;
for(j=i;j<N;j++)
{
temp=temp*10+s[j]-'0';
num[i][j]=temp;
}
}
memset(dp,0,sizeof(dp));
for(j=0;j<N;j++)
dp[j][0]=num[0][j];
for(j=0;j<N;++j)
{
int k,t;
for(k=1;k<=K;k++)
{
for(t=0;t<j;t++)
dp[j][k]=max(dp[j][k],dp[t][k-1]*num[t+1][j]);
}
}
cout<<dp[N-1][K]<<endl;
return 0;
}