设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
做法:
map[i][j]: 从i到j组成的数
dp[j][k]: 从0到j,有k个乘号所得的值
dp[j][k]=max(dp[l][k-1]*map[l+1][k];
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int map[51][51];
int main()
{int n,m,i,j,k,t;char str[10001];cin>>n>>m;cin>>str;for(i=0;i<n;i++){int mm;mm=0;for(j=i;j<n;j++){mm=mm*10+str[j]-'0';map[i][j]=mm;}}int dp[51][10];memset(dp,0,sizeof(dp));for(j=0;j<n;j++)dp[j][0]=map[0][j];for(j=0;j<n;j++){for(k=1;k<=m;k++){for(t=0;t<j;t++){dp[j][k]=max(dp[t][k-1]*map[t+1][j],dp[j][k]);}}}cout<<dp[n-1][m]<<endl;return 0;
}