这是我原先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++)
{
所以这里的循环顺序是对结果有影响的吗?