[ABC176F] Brave CHAIN 题解
校内测试搬了这题,想出了一个和题解区做法都不一样的做法。
首先对序列
考虑另外一个切入点,如果
继续考虑
假设
考虑从一开始得到
把
#include<cstdio>
#define N 6010
#define M 2010
using namespace std;
int n, a[N];
int f[M][M][4], g[M][M];
int fir[N][M], p[N];
void m(int &x, int y) { if(y > x)x = y; }
int noget(int s, int x)
{
if(a[3 * s] != x)return 3;
if(a[3 * s + 1] != x)return 2;
return 1;
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= 3 * n; i++)scanf("%d", a + i);
for(int i = 3 * n; i; i--)
{
for(int j = 1; j <= n; j++)
fir[i][j] = fir[i + 1][j];
fir[i][a[i]] = i;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= 3; j++)
if(a[3 * n - j] == a[3 * n] && i == a[3 * n])
f[n][i][j] = 1;
for(int i = 1; i <= n; i++)
if(a[3 * i] == a[3 * i + 1] && a[3 * i] == a[3 * i + 2])
p[i] = 1;
for(int i = 1; i <= n; i++)
p[i] += p[i - 1];
for(int s = n - 1; s; s--)
{
for(int i = 1; i <= n; i++)
{
if(fir[3 * s][i] / 3 == fir[fir[3 * s][i] + 1][i] / 3 && fir[3 * s][i] / 3 == s)
{
int k = noget(s, i);
m(g[s][i], g[s + 1][a[3 * s + 3 - k]] + 1);
}
if(a[3 * s] == a[3 * s + 1] && a[3 * s] == a[3 * s + 2])m(g[s][i], g[s + 1][i] + 1);
m(g[s][i], f[s + 1][a[3 * s]][1]);
m(g[s][i], f[s + 1][a[3 * s + 1]][1]);
m(g[s][i], f[s + 1][a[3 * s]][2]);
for(int k = 1; k <= 3; k++) m(g[s][i], f[s + 1][i][k]);
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= 3; j++)
{
int num = a[3 * s - j], x, y;
m(f[s][i][j], g[s][i]);
m(f[s][i][j], g[s][num]);
if(num == i)
{
int x = fir[3 * s][i] / 3;
if(x)
{
if(a[3 * x] == num) m(f[s][i][j], f[x + 1][a[3 * x + 1]][1] + 1 + p[x - 1] - p[s - 1]);
else if(a[3 * x + 1] == num) m(f[s][i][j], f[x + 1][a[3 * x]][1] + 1 + p[x - 1] - p[s - 1]);
else m(f[s][i][j], f[x + 1][a[3 * x]][2] + 1 + p[x - 1] - p[s - 1]);
}
}
if(fir[3 * s][i] / 3 == fir[fir[3 * s][i] + 1][i] / 3)x = fir[3 * s][i] / 3;
else x = 1e9;
if(fir[3 * s][num] / 3 == fir[fir[3 * s][num] + 1][num] / 3)y = fir[3 * s][num] / 3;
else y = 1e9;
if(!x)x = 1e9;
if(!y)y = 1e9;
if(x < y)
{
int k = noget(x, i);
m(f[s][i][j], f[x + 1][a[3 * s - j]][k] + 1 + p[x - 1] - p[s - 1]);
}
else if(x > y)
{
int k = noget(y, num);
m(f[s][i][j], f[y + 1][i][k] + 1 + p[y - 1] - p[s - 1]);
}
}
}
printf("%d", f[1][a[1]][1]);
return 0;
}