虽然过了,但是有疑问
查看原帖
虽然过了,但是有疑问
1517090
DrDuck楼主2025/2/7 13:21

这是我原先40pts的代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e+5 + 5;
int n, m;
int a[maxn], b[25], c[25][maxn];
int f[1100000];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		for (int j = 1; j <= m; j++)
		{
			c[j][i] = c[j][i - 1];
		}
		b[a[i]]++;
		c[a[i]][i]++;
	}
	int tt = (1 << m) - 1;
	memset(f, 0x3f, sizeof(f));
	f[0] = 0;
	for (int i = 1; i <= m; i++)
	{
		for (int j = 0; j <= tt; j++)
		{
			int jj = j, l = 1, cnt = 0;
			while (jj)
			{
				cnt++;
				int p = jj & 1;
				if (p)
				{
					l += b[cnt];
				}
				jj >>= 1;
			}
			int r = l + b[i] - 1, jjj = j;
//			if (jjj & (1 << i - 1))
//			{
//				continue;
//			}
			jjj |= (1 << i - 1);
			f[jjj] = min(f[jjj], f[j] + (r - l + 1) - (c[i][r] - c[i][l - 1]));
		}
	}
	cout << f[tt];
	return 0;
}

但是将循环顺序对调一下,就AC了:

	for (int j = 0; j <= tt; j++)
	{
		for (int i = 1; i <= m; i++)
		{

所以这里的循环顺序是对结果有影响的吗?

2025/2/7 13:21
加载中...