朴素的区间动规套上朴素的高精度。
#include <bits/stdc++.h>
using namespace std;
int n, m;
string s;
struct number
{
int s[100], len;
number (){memset (s, 0, sizeof (s)), len = 0;}
void print (){for (int i = len; i > 0; -- i)cout << s[i];}
number operator * (const number &b)
{
number c;
for (int i = 1; i <= len; ++ i)for (int j = 1; j <= b.len; ++ j)
{
c.s[i + j - 1] += s[i] * b.s[j];
c.s[i + j] += c.s[i + j - 1] / 10;
c.s[i + j - 1] %= 10;
}
c.len = len + b.len - 1;
if (c.s[c.len + 1])++ c.len;
return c;
}
bool operator > (const number &b)
{
if (len != b.len)return len > b.len;
for (int i = len; i > 0; -- i)if (s[i] != b.s[i])return s[i] > b.s[i];
return 1;
}
}f[50][50][15];
number make (string ss)
{
number a;
for (int i = 1; i <= int (ss.size ()); ++ i)a.s[ss.size () - i + 1] = ss[i - 1] - '0';
a.len = ss.size ();
return a;
}
signed main ()
{
ios::sync_with_stdio (0), cin.tie (0), cout.tie (0);
memset (f, 0, sizeof (f));
cin >> n >> m >> s;
for (int i = 1; i <= n; ++ i)
{
string ss = "";
for (int j = i; j <= n; ++ j)
{
ss += s[j - 1];
f[i][j][0] = make (ss);
}
}
for (int k = 1; k <= m; ++ k)for (int l = 1; l <= n; ++ l)for (int i = 1; i + l <= n + 1; ++ i)
{
int j = i + l - 1;
for (int ll = 0; ll < k; ++ ll)for (int kk = i + 1; kk <= j; ++ kk)if (f[i][kk - 1][ll] * f[kk][j][k - ll - 1] > f[i][j][k])f[i][j][k] = f[i][kk - 1][ll] * f[kk][j][k - ll - 1];
}
f[1][n][m].print ();
return 0;
}
个人编码习惯比较怪异,请谅解。