/ WHOJ / 题库 /

整数划分

整数划分

题目描述

给出一个长度为 \(n\) 的数,要在其中加 \(m-1\) 个乘号,分成 \(m\) 段,这 \(m\) 段的乘积之和最大, \(m<n<18\) ;有 \(T\) 组数据,\(T<=10000\)。

格式

输入格式

输入第 \(1\) 行一个整数 \(t\),表示数据组数。
接下来一共 \(t\) 行,每行两个整数,第 \(1\) 个整数表示要分段的整数,第 \(2\) 整数表示 \(m\),即要分成的段数。

输出格式

输出一共 \(t\) 行,每行一个整数,表示分成 \(m\) 段后能得到的最大乘积。

样例1

输入样例1

1
1231 3

输出样例1

62

提示

可以先预处理出原数从第 \(i\) 位到第 \(j\) 位的区间的数值 \(A[i][j]\) 是多少,这样转移就方便了,预处理也要尽量降低复杂度。\(F[i][j]\) 表示把这个数前 \(i\) 位分成 \(j\) 段得到的最大乘积。
f[i][j]=max(f[i][j],f[k][j-1]*a[k+1][i]),
\(1<k<i<=n, j<=m\)