题目
- 题目:给出一个长度为n的数.问:如何在数中添加k个乘号,使乘积最大?输出这个最大值.
- 输入格式:
- 第一行,输入两个数n,k,中间有空格隔开.
- 第二行,输入这个长度为n的数.
- 输出格式:仅有一行,输出最大值.
- 例子:
分析
- 我们用
f[i][j][k]
来表示数的每一个数字组成的区间[i,j]
中加入k
个乘号的最大乘积,定义一个指针u
来枚举区间[i,j)
中的每一个位置,则动态转移方程为f[i][j][k]=max(f[i][j][k],f[i][u][k-1]*f[u+1][j][0])
,则我们要求的最大值,就保存在f[0][n-1][k]
中.
程序
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n,k;
scanf("%d%d",&n,&k);
char a[n],s[1];
gets(s),gets(a);
long long f[n][n][k+1],to;
memset(f,0,sizeof(f));
for(int i=0;i<=n-1;i++)
for(int j=i;j<=n-1;j++){
to=1;
for(int t=j;t>=i;t--)
f[i][j][0]+=(a[t]-'0')*to,to*=10;
}
for(int k0=1;k0<=k;k0++)
for(int i=0;i<=n-1-k0;i++)
for(int j=i+k0;j<=n-1;j++)
for(int u=i;u<=j-1;u++)
f[i][j][k0]=max(f[i][j][k0],f[i][u][k0-1]*f[u+1][j][0]);
printf("%I64d",f[0][n-1][k]);
return 0;
}