题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=746
分析:
dp[i][j] : 表示在区间 [0,i] 插入 j 个乘号可以得到的最大值
a[i][j] : 表示区间 [i,j] 所形成的数
则: dp[i][j]=max(dp[k][j-1]*a[k+1][i])
代码:
#include<cstdlib>
#include<string>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<ctime>
#include<cstdio>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
int main()
{
int tt;
scanf("%d",&tt);
ll dp[25][25];
ll a[25][25];
char ss[25];
while(tt--)
{
int m;
scanf("%s%d",ss,&m);
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
m--;
int len = strlen(ss);
for(int i=0;i<len;i++)
{
a[i][i] = ss[i]-'0';
// cout<<a[i][i]<<endl;
for(int j=i+1;j<len;j++)
{
a[i][j] = a[i][j-1] * 10 + ss[j]-'0';
// cout<<a[i][j]<<endl;
}
}
for(int i=0;i<len;i++)
{
dp[i][0]=a[0][i];
}
for(int j=1;j<=m;j++)
{
for(int i=j;i<len;i++)
{
for(int k=0;k<i;k++)
{
dp[i][j]=max(dp[i][j],dp[k][j-1]*a[k+1][i]);
}
}
}
printf("%lld\n",dp[len-1][m]);
}
return 0;
}