题目大意:给定数n、k,求在数n中插入k个乘号所能取得的最大值。
思路:记f[i][k]表示前i个字符插入k个乘号能取得的最大值,则有f[i][k]=max{f[j][k-1]*num[j][i]},num[j][i]表示从j到i的字符组成的数的值,初始化f[i][0]=num[1][i],目标f[n][k]。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=45;
int n,k;
int tmp[maxn],num[maxn][maxn],f[maxn][8];
void init()
{
scanf("%d%d\n",&n,&k);
for (int i=1;i<=n;++i)
{
char ch;
scanf("%c",&ch);
tmp[i]=num[i][i]=ch-'0';
}
for (int i=1;i<=n;++i)
for (int j=i+1;j<=n;++j)
num[i][j]=num[i][j-1]*10+tmp[j];
}
void dp()
{
for (int i=1;i<=n;++i)
f[i][0]=num[1][i];
for (int s=1;s<=k;++s)
for (int i=2;i<=n;++i)
for (int j=1;j<i;++j)
f[i][s]=max(f[i][s],f[j][s-1]*num[j+1][i]);
printf("%d",f[n][k]);
}
int main()
{
init();
dp();
return 0;
}