WA on #4 #11 #12 #13
#include <bits/stdc++.h>
using namespace std;
const int N = 50, K = 10, M = 510;
struct node
{
int a[M], len;
friend node operator * (const node &n1, const node &n2)
{
node n3 = (node){{0}, n1.len + n2.len - 1};
for(int i = 1;i <= n1.len;++i)
for(int j = 1;j <= n2.len;++j)
n3.a[i + j - 1] += n1.a[i] * n2.a[j];
for(int i = 1;i <= n3.len;++i)
{
n3.a[i + 1] += n3.a[i] / 10;
n3.a[i] %= 10;
}
if(n3.a[n3.len + 1])
n3.len++;
return n3;
}
friend bool operator < (const node &n1, const node &n2)
{
if(n1.len != n2.len)
return n1.len < n2.len;
for(int i = n1.len;i >= 1;--i)
if(n1.a[i] != n2.a[i])
return n1.a[i] < n2.a[i];
return false;
}
}dp[N][N][K];
int a[N], n, k;
void print(node a)
{
for(int i = a.len;i >= 1;--i)
cout << a.a[i];
cout << "\n";
}
int main()
{
cin >> n >> k;
for(int i = 1;i <= n;++i)
{
char c;
cin >> c;
a[i] = c - '0';
}
for(int i = 1;i <= n;++i)
{
for(int j = i;j <= n;++j)
{
dp[i][j][0].len = j - i + 1;
for(int p = i;p <= j;++p)
dp[i][j][0].a[j - p + 1] = a[p];
}
}
for(int i = 1;i <= k;++i)
{
for(int len = 2;len <= n;++len)
{
for(int l = 1;l + len - 1 <= n;++l)
{
int r = l + len - 1;
dp[l][r][i].len = 1;
dp[l][r][i].a[1] = 0;
for(int p = l;p < r;++p)
{
for(int k1 = 0;k1 < i;++k1)
{
int k2 = i - k1 - 1;
node f = dp[l][p][k1] * dp[p+1][r][k2];
if(dp[l][r][i] < f)
dp[l][r][i] = f;
}
}
}
}
}
print(dp[1][n][k]);
return 0;
}