区间dp球调
查看原帖
区间dp球调
685604
Neovim楼主2022/11/11 22:13

最大值没错,最小值有问题qwq

#include <bits/stdc++.h>
using namespace std;

const int N = 105, inf = 2e9;
int n, m, a[N];
int f[N][N][10], g[N][N][10];

inline int mod(int x) { return (x % 10 + 10) % 10; }

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> a[i], a[i + n] = a[i];
	for (int i = 1; i <= n * 2; i++)
		a[i] += a[i - 1];
	for (int i = 1; i <= n * 2; i++)
		for (int j = i; j <= n * 2; j++)
			f[i][j][1] = g[i][j][1] = mod(a[j] - a[i - 1]);
	for (int st = 1; st <= n * 2; st++)
	{
		for (int i = 1; i <= n * 2; i++)
		{
			for (int j = 2; j <= m; j++)
			{
				f[st][i][j] = inf;
				for (int k = j - 1; k < i; k++)
				{
					f[st][i][j] = min(f[st][i][j], f[st][k][j - 1] * mod(a[i] - a[k]));
					g[st][i][j] = max(g[st][i][j], g[st][k][j - 1] * mod(a[i] - a[k]));
				}
			}
		}
	}
	int minv = inf, maxv = -inf;
	for (int i = 1; i <= n; i++)
	{
		minv = min(minv, f[i][i + n - 1][m]);
		maxv = max(maxv, g[i][i + n - 1][m]);
	}
	cout << minv << endl
		 << maxv << endl;
	return 0;
}
2022/11/11 22:13
加载中...