遇见这种数据范围,这种区间染色的题,注意考虑区间DP,另外为了方便处理,先对数组进行压缩,保证相邻的元素不相等
//dp[l][r][0]变成col[l]的最小步数
//dp[l][r][1]变成col[r]的最小步数
int a[MAXN],c[MAXN];
int dp[5555][5555][2];
void solve()
{
int n;cin>>n;
rpp(i,n) cin>>c[i];
int nn=0;
rpp(i,n)
{
int j=i;
while(j+1<=n&&c[j+1]==c[i]) ++j;
a[++nn]=c[i];
i=j;
}
n=nn;
rpp(i,n) for(int j=i;j<=n;++j) dp[i][j][0]=dp[i][j][1]=(i==j?0:6000);
for(int k=2;k<=n;++k)//枚举长度
{
for(int i=1;i<=n&&i+k-1<=n;++i)//枚举区间起点
{
int j=i+k-1;
int x=min(dp[i+1][j][0]+1,dp[i+1][j][1]+(a[i]!=a[j]));
dp[i][j][0]=min(x,dp[i][j][0]);
x=min(dp[i][j-1][0]+(a[j]!=a[i]),dp[i][j-1][1]+1);
dp[i][j][1]=min(x,dp[i][j][1]);
}
}
cout<<min(dp[1][n][0],dp[1][n][1])<<endl;
}
signed main()
{
int T = 1;
while (T--) solve();
return 0;
}