題目
- 題目:給出一個長度爲n的數.問:如何在數中添加k個乘號,使乘積最大?輸出這個最大值.
- 輸入格式:
- 第一行,輸入兩個數n,k,中間有空格隔開.
- 第二行,輸入這個長度爲n的數.
- 輸出格式:僅有一行,輸出最大值.
- 例子:
- input:
- 4 2
- 1231
- output:
- 62
分析
- 我們用
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;
}