哪里不对?
查看原帖
哪里不对?
1494609
jym15063701069楼主2025/7/30 09:48
#include<bits/stdc++.h>
using namespace std;
/*====================*/
using lnt = long long;
//#define long long int;
/*====================*/
const int INF = 0X3F3F3F3F;
/*====================*/
const int N = 5e1+10;
const int M = 9 + 10;
const int A = 1e5;
const int MOD = 10;
/*====================*/
/*====================*/
lnt n, m;
lnt arr[N * 2];

lnt f_max[N * 2][N * 2][M]; //第i~j个数分成k组时的最大值
lnt f_min[N * 2][N * 2][M]; //第i~j个数分成k组时的最小值
/*====================*/
lnt Ask(const int &l, const int &r) //sum{arr[l]~arr[r]}
{
	if (l > r) return 0;

	return (arr[r] - arr[l - 1] + A) % MOD;
}
/*====================*/
void Solve(void)
{
	//输入
	cin >> n >> m;

	for (int i = 1; i <= n; ++i)
	{
		cin >> arr[i];
	}

	//化环为链
	for (int i = n + 1; i <= 2 * n; ++i)
	{
		arr[i] = arr[i - n];
	}

	//前缀和
	for (int i = 1; i <= n * 2; ++i)
	{
		arr[i] = arr[i - 1] + arr[i];
	}

	//初始化f
	memset(f_max, -INF, sizeof f_max);
	memset(f_min, +INF, sizeof f_min);

	for (int i = 1; i <= n * 2; ++i)
	{
		for (int j = 1; j <= n * 2; ++j)
		{
			f_max[i][j][1] = Ask(i, j);
			f_min[i][j][1] = Ask(i, j);
		}
	}

	//转移
	for (int i = 1; i <= n * 2; ++i)
	{
		for (int j = i + 1; j <= 2 * n; ++j)
		{
			for (int k = 2; k <= m; ++k)
			{
				for (int mid = i; mid < j; ++mid)
				{
					f_max[i][j][k] = max(f_max[i][j][k], f_max[i][mid][k - 1] * f_max[mid + 1][j][1]);
					f_min[i][j][k] = min(f_min[i][j][k], f_min[i][mid][k - 1] * f_min[mid + 1][j][1]);
				}
			}
		}
	}

	//计算答案
	lnt ans_max = -INF;
	lnt ans_min = +INF;

	for (int l = 1; l <= n; ++l)
	{
		int r = l + n - 1;
		ans_max = max(ans_max, f_max[l][r][m]);
		ans_min = min(ans_min, f_min[l][r][m]);
	}

	//输出
	cout << ans_min << '\n' << ans_max;
}
/*====================*/
signed main()
{
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
#endif
	ios::sync_with_stdio(false);
	cin.tie(NULL), cout.tie(NULL);
	int T = 1; //cin>>T;

	while (T--) Solve();

	return 0;
}
2025/7/30 09:48
加载中...