题目:http://www.gdfzoj.com/oj/contest/161/problems/7
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
有一个数字串:312, 当N=3,K=1时会有以下两种分法
1) 3*12=36
2) 31*2=62
这时,符合题目要求的结果是:31*2=62
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
long long a[15][15],f[15][15][15];
int main()
{
int i,n,m,j,k,l;
string s1,s;
freopen("a.txt","r",stdin);
cin>>n>>m;
cin>>s;
for (i=0;i<n;i++)
for (j=1;i+j<=n;j++)
{
s1=s.substr(i,j);
// cout<<s1<<endl;
a[i][i+j-1]=0;
for (k=0;k<s1.length();k++)
a[i][i+j-1]=a[i][i+j-1]*10+(int)(s1[k])-'0';
}
for (j=0;j<n;j++)//长度
{
for (i=0;i+j<n;i++)//起始位置
{
for (k=0;k<=min(j,m);k++)//分成k+1份
{
if (k==0)
f[i][i+j][0]=a[i][i+j];
else
for (l=i+k-1;l<i+j;l++)//插空位置
f[i][i+j][k]=max(f[i][i+j][k],f[i][l][k-1]*a[l+1][i+j]);
}
}
}
printf("%lld\n",f[0][n-1][m]);
return 0;
}