代码RE求调
查看原帖
代码RE求调
553369
MAyxWACE楼主2024/2/23 15:54
#include<bits/stdc++.h>
using namespace std;
int n, k;
struct node
{
	int len;
	int a[50];
};
node chen(node x, node y)
{
	int leny = y.len, lenx = x.len;
	node s;
	s.len = lenx + leny - 1;
	for(int i = 1; i <= 45; i++)
		s.a[i] = 0;
	for(int i = 1; i <= lenx; i++)
	{
		for(int j = 1; j <= leny; j++)
		{
			s.a[i + j - 1] += x.a[i] * y.a[j] % 10;
			s.a[i + j] += x.a[i] * y.a[j] / 10;
		}
	}
	s.len += (s.a[s.len + 1] >= 1 ? 1 : 0);
	int l = s.len;
	for(int i = 1; i < l; i++)
	{
		s.a[i + 1] += s.a[i] / 10;
		s.a[i] %= 10;
	}
	return s;
}
node input()
{
	node s;
	char c;
	s.len = 0;
	scanf("%c", &c);
	do
	{
		s.a[++s.len] = c - '0';
		scanf("%c", &c);
	}while(c != ' ' && c != '\n');
	for(int i = 1; i <= s.len / 2; i++)
		swap(s.a[i], s.a[s.len - i + 1]);
	return s;
}
void output(node a)
{
	
	for(int i = a.len; i >= 1; i--)
		printf("%d", a.a[i]);
	printf("\n");
}
node int_node(int x)
{
	node ans;
	int len = 0;
	while(x)
	{
		ans.a[++len] = x % 10;
		x /= 10;
	}
	ans.len = len;
	return ans;
}
node node_node(node a, int st, int ed)
{
	node ans;
	int l = a.len;
//	cout << "l=" << l << endl;
	st = l - st + 1;
	ed = l - ed + 1;
	for(int i = ed; i <= st; i++)
	{
		ans.a[i - ed + 1] = a.a[i];
	}
	ans.len = st - ed + 1;
	while(1)
	{
		if(ans.a[ans.len] == 0)
			ans.len--;
		else
			break;
	}
	return ans;
}
bool cmp(node a, node b)
{
	if(a.len != b.len)
		return a.len < b.len;
	int l = a.len;
	for(int i = l; i >= 1; i--) 
		if(a.a[i] != b.a[i])
			return a.a[i] < b.a[i];
	return 1;
}
node f[15][45], a;
int main()
{
	scanf("%d%d\n", &n, &k);
	a = input();
	for(int i = 0; i <= k; i++)
		for(int j = 0; j <= n; j++)
			f[i][j].len = 1;
	for(int i = 1; i <= n; i++)
		f[0][i] = node_node(a, 1, i);
	for(int j = 0; j <= k; j++)
		f[j][1] = int_node(1);
//	for(int i = 1; i <= n; i++)
//	{
//		output(f[0][i]);
//	}
	for(int i = 1; i <= k; i++)
	{
		for(int j = i; j <= n; j++)
		{
			for(int t = i; t <= j - 1; t++)
			{
//				printf("i=%d j=%d t=%d\nf[%d][%d]=", i, j, t, i, j);
//				output(f[i][j]);
				node key = chen(f[i - 1][t], node_node(a, t + 1, j));
//				printf("f[%d-1][t=%d]=", i, t);
//				output(f[i - 1][t]);
//				printf("t+1~j=");
//				output(node_node(a, t + 1, j));
//				printf("key=");
//				output(key);
				f[i][j] = max(f[i][j], key, cmp);
//				printf("f[%d][%d]=", i, j);
//				output(f[i][j]);
//				cout << endl;
			}
		}
	}
	output(f[k][n]);
	return 0;
}
2024/2/23 15:54
加载中...