该题就是DP + 高精度
状态转移方程:
dp[ i ] [ k ] = max(dp[ j ] [ k - 1] * (i + 1 到 n 组成的数), dp[ i ] [ k ])
dp[ i ] [ k ]表示的状态为,前i个数已经放了k个乘号(包括第i位后面的乘号)
struct node {
int val[maxn], len;
bool exist;
}f[maxn][10], ans[maxn];
上面这代码是记录数据的结构体
len就是数据的位数,val[ ]记录每一位数字
高精度的乘法
node mul(const node& x, const node& y) {
node nn;
nn.exist = true;
nn.len = x.len + y.len - 1;
for(int i = 1;i <= nn.len; i++)
nn.val[i] = 0;
for(int l = 1; l <= x.len; l++){
for(int r = 1; r <= y.len; r++){
nn.val[l + r - 1] = x.val[l] * y.val[r];
}
}
int q = 0;
for(int i = 1; i <= nn.len; i++) {
nn.val[i] += q;
q = nn.val[i] / 10;
nn.val[i] %= 10;
}
while(q > 0){
nn.val[++nn.len] = q % 10;
q /= 10;
}
return nn;
}