整数划分(四)
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷。。亲爱的你能帮帮他吗?
问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define bug printf("hihi\n")
#define eps 1e-8
typedef long long ll;
using namespace std;
#define INF 0x3f3f3f3f
#define N 105
char c[100];
int va[N];
ll sum[N][N];
int n,k;
ll dp[N][N];
void inint()
{
int i,j;
memset(sum,0,sizeof(sum));
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
sum[i][j]=sum[i][j-1]*10+va[j];
}
void DP()
{
int i,j;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=1;i<=k;i++)
{
dp[i][i]=dp[i-1][i-1]*va[i];
for(int j=i+1;j<=n;j++)
for(int t=i-1;t<j;t++)
dp[j][i]=max(dp[j][i],dp[t][i-1]*sum[t+1][j]);
}
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%s",c+1);
scanf("%d",&k);
n=strlen(c+1);
for(i=1;i<=n;i++)
va[i]=c[i]-'0';
inint();
DP();
printf("%lld\n",dp[n][k]);
}
return 0;
}