90pts求调。WA on#4#11#12#13。
查看原帖
90pts求调。WA on#4#11#12#13。
677091
MnZnOIer楼主2024/7/5 15:47

朴素的区间动规套上朴素的高精度。

#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;
}

个人编码习惯比较怪异,请谅解。

2024/7/5 15:47
加载中...