这道题是一道DP题,
解题思路: NUM[i][j]表示在数字中从i到j位组成的数。
dp[i][j] 表示前i位数字分成j段的最大乘积。
状态转移方程 if(j==1) dp[i][j]=NUM[1][i];
if(j>=1&&j<=i) dp[i][j]=max{ dp[d,j-1]*NUM[d+1][i] }其中 1<=d<i
else if(i<j) dp[i][j]=0;
-----------------------------------------------------------------------------------
1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <string> 5 using namespace std; 6 int num[50+5]; 7 int NUM[50+5][50+5]; 8 int dp[50+5][50+5]; 9 int change(int i,int j) 10 { 11 int res=0; 12 int I; 13 for(I=i;I<=j;++I) 14 { 15 res*=10; 16 res+=num[I]; 17 } 18 return res; 19 } 20 int main() 21 { 22 string abc; 23 int i,j,d; 24 int n,k; 25 while(cin>>n>>k) 26 { 27 cin>>abc; 28 memset(dp,0,sizeof(dp)); 29 for(i=0;i<n;++i) //字符串转换为数组 30 { 31 num[i+1]=abc[i]-'0'; 32 } 33 for(i=1;i<=n;++i) 34 for(j=i;j<=n;++j) 35 { 36 NUM[i][j]=change(i,j); 37 }; 38 for(i=1;i<=n;++i) 39 dp[i][1]=NUM[1][i]; 40 for(i=1;i<=n;++i) 41 { 42 for(j=2;j<=k+1;++j) 43 { 44 45 if(j>1&&j<=i) 46 { 47 for(d=1;d<i;++d) 48 { 49 dp[i][j]=max(dp[i][j],dp[d][j-1]*NUM[d+1][i]); 50 } 51 } 52 else if(i<j) dp[i][j]=0; 53 } 54 } 55 cout<<dp[n][k+1]<<endl; 56 } 57 return 0; 58 }