题目链接:
http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1186
思路:
区间DP。dp[i][j]表示前i个数字里面有j个乘号的时候的最大值。
那么就有dp[i][j]=max(dp[k][j-1]*x),这里1<=k<j,x表示从k~j组成的数。
代码:
#include<stdio.h>
#include<string.h>
#define ll __int64
ll max(ll a,ll b)
{
return a>b?a:b;
}
int main()
{
ll n,i,j,k,K,l,dp[55][10],x,w;
char s[45];
while(scanf("%I64d%I64d",&n,&K)!=EOF)
{
x=0;
ll maxi=0;
scanf("%s",s);
l=strlen(s);
for(i=0;i<l;i++)
s[i]=s[i]-'0';
for(i=0;i<55;i++)
for(j=0;j<10;j++)
dp[i][j]=1;
dp[1][0]=s[0];
for(i=2;i<=l;i++)
{
for(j=0;j<i&&j<=K;j++)
{
for(k=1;k<i;k++)
{
x=0;
if(j==0) //如果没有乘号就是他本身。
{
for(w=0;w<i;w++)
x=x*10+s[w];
dp[i][0]=x;
}
else {
for(w=k;w<i;w++)
x=x*10+s[w];
if(k>j-1)
dp[i][j]=max(dp[i][j],dp[k][j-1]*x);
}
}
}
//maxi=max(maxi,dp[i][j]);
}
printf("%I64d\n",dp[n][K]);
}
return 0;
}