题意:
给出一个长度为 n 的数组,一次操作可以选择一段连续且值都相同的区间,然后使其变成其他值,问最少需要多少次操作,才能使得数组的值全相等。数组中每个数最多出现 15 次。
思路:
首先分析,可以直接将n个数压缩成m个不同的数的数组,m个数如果全部不同那么需要m-1 次操作,其实这题的最少多少次操作我们需要把他转化成最多减少多少次操作,能想到这点就好做了,dp[i][j]表示i到j的区间内最多减少多少次操作。状态转移方程就如下:
枚举K 的位置就可以得到答案了 ,ans= m-1-dp[1][m]
for(int len=1;len<=m;len++) {
for(int i=1;i<=m-len+1;i++){
int j=i+len-1;
if(len==1) dp[i][j]=0;
else if(len==2) {
if(b[i]==b[j]) dp[i][j]=1;
else dp[i][j]=0;
}
else {
dp[i][j]=dp[i][j-1];
int k=pre[j];
while(k>=i){
dp[i][j]=max(dp[i][j],dp[k+1][j-1]+dp[i][k]+1);
k=pre[k];
}
}
}
}