设有一个长度为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;
}