合并相邻同质片段的最小合并成本问题(每个片段有颜色与质量两个属性)
字数 6327 2025-12-23 04:45:15

合并相邻同质片段的最小合并成本问题(每个片段有颜色与质量两个属性)

题目描述
我们有一个由n个片段构成的数组A,每个片段i有两个属性:颜色c[i](用字符表示)和质量w[i](正整数)。目标是反复执行合并操作,每次可以合并两个相邻的片段i和j,生成一个新的片段,新片段将取代原来的两个片段。新片段的颜色由合并规则决定:如果原来两个片段的颜色相同,则新片段颜色保持该颜色;如果颜色不同,则新片段颜色为一个特殊字符'X'(代表混合颜色)。新片段的质量为原来两个片段质量之和。

每次合并的成本定义为:新片段的质量乘以一个与颜色相关的系数。具体来说,如果新片段颜色为颜色a(字符'a'),则成本系数为k_a(已知正整数);如果新片段颜色为'X',则成本系数为K(已知正整数,通常比单一颜色的系数大,代表混合代价)。
即,合并两个相邻片段i和j的成本为:(w[i] + w[j]) * coeff(newColor),其中newColor由上述规则决定,coeff('a') = k_a,coeff('X') = K。

我们需要将所有片段合并成一个片段,求最小的总合并成本。

示例
假设片段数组:颜色序列 = ['a', 'b', 'a'],质量 = [2, 3, 4],系数 k_a = 1, k_b = 2, K = 5。
一种合并方式:

  1. 先合并中间片段'b'(质量3)与右边片段'a'(质量4),颜色不同 → 新颜色'X',质量=7,成本=7 * 5 = 35。新数组变为 ['a', 'X'],质量[2, 7]。
  2. 合并剩下的两个片段:颜色'a'与'X'不同 → 新颜色'X',质量=2+7=9,成本=9 * 5 = 45。
    总成本 = 35+45 = 80。
    另一种合并方式:
  3. 先合并左边'a'(2)与'b'(3),颜色不同 → 'X',质量5,成本=5*5=25。数组变为 ['X', 'a'],质量[5,4]。
  4. 合并'X'与'a',颜色不同 → 'X',质量9,成本=9*5=45。总成本=70。
    因此最小成本是70(第二种方式)。
    目标是找到最小总成本。

解题过程循序渐进讲解

这是一个典型的区间动态规划问题,因为每次合并相邻片段,最终状态是整个区间合并成一个片段。我们需要考虑合并顺序对总成本的影响,因为合并顺序会影响中间片段的质量与颜色,进而影响后续合并的成本。

步骤1:定义状态
我们定义 dp[l][r] 表示将区间 [l, r](从第 l 个片段到第 r 个片段,下标从0开始)合并成一个片段所需的最小总成本。
但是,注意到合并后的片段颜色会影响后续与相邻区间合并的成本,而 dp[l][r] 仅存储最小成本是不够的,因为不同的合并方式可能产生不同的最终颜色,而后续合并时(当 [l, r] 与左边或右边区间合并时)我们需要知道这个颜色才能计算成本。
因此,状态需要额外记录颜色信息。一个常用的技巧是:将颜色作为状态的第三维。但颜色可能取值很多(题目中颜色为字符,但我们可以映射为整数)。实际上,对于区间 [l, r] 合并后的最终颜色,只可能是原来该区间中出现的某些颜色,或者是'X'。但为了通用性,我们可以把颜色作为状态的一部分。

然而,这样状态数会很大:dp[l][r][color],其中 color 可以是所有可能的颜色。但注意到合并规则:如果区间内所有片段颜色相同,则最终颜色就是该颜色;否则,一旦在合并过程中出现两种不同颜色的合并,最终颜色就会变成'X',并且之后无论再与什么合并,颜色永远是'X'(因为'X'与其他任何颜色(包括'X'本身)合并,规则是颜色不同 → 新颜色'X')。
因此,对于区间 [l, r],其最终颜色只有两种可能:

  • 单一颜色 col(即区间内所有片段颜色相同,且从未与不同颜色合并过),此时最终颜色就是 col。
  • 混合颜色 'X'。

所以我们只需用两个状态表示即可:
dp[l][r][0]:将区间 [l, r] 合并成一个片段,且最终颜色为单一颜色(即区间内所有原始片段颜色相同)的最小成本。如果区间内原始片段颜色不完全相同,则 dp[l][r][0] = INF(不可行)。
dp[l][r][1]:将区间 [l, r] 合并成一个片段,且最终颜色为'X'的最小成本。注意,即使区间内原始颜色相同,也可能通过某些合并顺序故意先与外部混合成'X',但这里我们只记录最终颜色为'X'的最小成本。

但这样还需要知道当最终颜色为单一颜色时,具体是哪种颜色,以便计算系数 k_a。因此,我们可以再细化:
设 color[l][r] 表示当区间 [l, r] 内所有原始片段颜色相同时的颜色值,否则为特殊标记(如 -1)。
那么,对于 dp[l][r][0],我们只针对 color[l][r] 有定义的情况;对于 dp[l][r][1],总是有定义。

步骤2:状态转移方程
考虑如何将区间 [l, r] 合并。最后一次合并一定是将左子区间 [l, m] 和右子区间 [m+1, r] 合并,其中 m 是分割点(l ≤ m < r)。我们需要枚举这个分割点 m。

对于最终颜色为单一颜色的情况(dp[l][r][0]):
要求区间 [l, r] 内所有原始片段颜色相同,设为 col。那么左子区间和右子区间的最终颜色都必须为 col,即 dp[l][m][0] 和 dp[m+1][r][0] 都必须可行,且颜色都是 col。
此时合并后的颜色为 col(因为相同颜色合并后颜色不变),质量 = 总质量 sum(l, r) = w[l] + ... + w[r]。
合并成本 = sum(l, r) * k_col。
因此:
dp[l][r][0] = min_{m} { dp[l][m][0] + dp[m+1][r][0] + sum(l, r) * k_col },前提是 color[l][m] = color[m+1][r] = col。

对于最终颜色为'X'的情况(dp[l][r][1]):
有两种可能:

  1. 左子区间和右子区间合并时,颜色不同(包括一方为'X',另一方为单一颜色;或者双方都是'X';或者双方为不同单一颜色)。此时合并后的颜色一定是'X'。
    设左子区间最终颜色为 cL,右子区间最终颜色为 cR,且 cL ≠ cR(注意,如果一方为'X',则必然与另一方不同,因为'X'与任何单一颜色视为不同;'X'与'X'也视为不同?实际上规则:两个颜色相同的合并后颜色不变,两个颜色不同的合并后为'X'。如果两个都是'X',它们颜色相同吗?题目中'X'是一个特殊标记,两个'X'应视为颜色相同,合并后仍为'X'。但这里为了统一,我们可以认为'X'是一种颜色,两个'X'合并后颜色仍为'X',且系数为K。所以在我们的状态中,'X'作为一种颜色处理,其系数为K。
    那么,合并成本 = sum(l, r) * coeff(newColor)。这里 newColor 由规则决定:若 cL 和 cR 相同,则 newColor = cL;否则 newColor = 'X'。但因为我们这里考虑的是最终颜色为'X'的情况,所以必须 cL ≠ cR,此时 newColor = 'X',成本 = sum(l, r) * K。
    但是,左子区间和右子区间本身的颜色可能为单一颜色或'X'。我们需要它们合并后得到'X',所以要求 cL ≠ cR。
    因此,对于给定的 m,我们需要枚举左子区间的最终颜色类型(0或1)和右子区间的最终颜色类型,并检查颜色是否不同。

  2. 左子区间和右子区间合并时颜色相同,但都是'X'?如果都是'X',颜色相同,合并后仍为'X',此时成本 = sum(l, r) * K(因为'X'的系数是K)。这种情况也属于最终颜色为'X'。

综合起来,dp[l][r][1] 可以从所有可能的分割点 m 以及左右子区间的颜色组合转移而来,只要合并后的颜色为'X'即可。

更形式化地:
对于每个分割点 m,设左子区间最终颜色为 cL(可能是单一颜色 col1 或 'X'),右子区间最终颜色为 cR(可能是单一颜色 col2 或 'X')。
我们定义 coeff(c) 为颜色 c 对应的系数:如果 c 是单一颜色 a,则 coeff = k_a;如果 c 是 'X',则 coeff = K。
合并后的颜色 mergeColor = (cL == cR ? cL : 'X')。
如果 mergeColor == 'X',则本次合并成本 = sum(l, r) * K。
那么,总成本 = dp_left + dp_right + sum(l, r) * K,其中 dp_left 是左子区间合并成颜色 cL 的最小成本,dp_right 是右子区间合并成颜色 cR 的最小成本。

我们需要枚举所有可能的 (cL, cR) 组合,使得 mergeColor == 'X',然后取最小值。

但是,为了简化,我们可以将 dp[l][r][0] 只用于单一颜色相同的情况,而 dp[l][r][1] 表示最终颜色为'X'的最小成本,而不关心其内部是否曾经是单一颜色。那么,对于 dp[l][r][1] 的转移,我们可以考虑:

  • 左子区间最终颜色可以是单一颜色(如果可行)或'X',右子区间同样。只要左右颜色不同,合并后即为'X'。
  • 左右颜色相同但都是'X',合并后也是'X'。

因此,转移方程可以写成:
dp[l][r][1] = min_{m, tL, tR} {
dp[l][m][tL] + dp[m+1][r][tR] + sum(l, r) * K
}
其中 tL, tR ∈ {0,1},但需要满足:
如果 tL=0 且 tR=0,则要求 color[l][m] ≠ color[m+1][r](因为如果相同则合并后颜色为单一颜色,不属于dp[l][r][1]);
如果 tL=0 且 tR=1,则总是满足(因为单一颜色与'X'不同);
如果 tL=1 且 tR=0,总是满足;
如果 tL=1 且 tR=1,则总是满足(两个'X'相同,但合并后仍为'X',成本系数为K,所以也属于dp[l][r][1])。

另外,dp[l][r][0] 的转移如前所述,只在区间内所有片段颜色相同时才可能。

步骤3:初始化
对于长度为1的区间(l == r):
dp[l][l][0] = 0(已经是一个片段,无需合并,成本为0),且 color[l][l] = c[l]。
dp[l][l][1] = INF(不可能通过合并得到'X',因为只有一个片段,其颜色就是原始颜色,不是'X'),除非原始颜色就是'X'?但题目中原始片段颜色不会是'X','X'只作为混合后的颜色出现。所以 dp[l][l][1] = INF。

步骤4:计算顺序
按区间长度从小到大计算,从长度2到n。

步骤5:最终答案
整个区间 [0, n-1] 合并成一个片段的最小成本是 min(dp[0][n-1][0], dp[0][n-1][1])。


实例演算(用之前示例)
n=3,颜色 c = ['a', 'b', 'a'],质量 w = [2,3,4],k_a=1, k_b=2, K=5。

预处理 color[l][r]:
color[0][0]='a', color[1][1]='b', color[2][2]='a'。
color[0][1]:颜色不同,为 -1(表示不是单一颜色)。
color[1][2]:颜色不同,为 -1。
color[0][2]:颜色不全相同,为 -1。

预处理 sum(l,r):
sum(0,0)=2, sum(1,1)=3, sum(2,2)=4,
sum(0,1)=5, sum(1,2)=7, sum(0,2)=9。

初始化 dp[l][l][0]=0, dp[l][l][1]=INF。

长度2的区间:

  1. 区间 [0,1](颜色 a,b)
    单一颜色情况:color[0][1] = -1,所以 dp[0][1][0] = INF。
    混合颜色情况(dp[0][1][1]):枚举分割点 m=0(唯一可能)。
    左子区间[0,0]颜色为'a'(tL=0),右子区间[1,1]颜色为'b'(tR=0),且 color[0][0] ≠ color[1][1],所以符合条件。
    cost = dp[0][0][0] + dp[1][1][0] + sum(0,1)K = 0 + 0 + 55 = 25。
    所以 dp[0][1][1] = 25。

  2. 区间 [1,2](颜色 b,a)
    dp[1][2][0] = INF(颜色不同)。
    dp[1][2][1]:m=1,左子区间[1,1]颜色'b',右子区间[2,2]颜色'a',不同。
    cost = 0+0 + sum(1,2)K = 75 = 35。
    所以 dp[1][2][1] = 35。

长度3的区间 [0,2]:
先计算 dp[0][2][0]:要求颜色相同,但 color[0][2] = -1,所以 INF。

dp[0][2][1]:枚举分割点 m=0 和 m=1。

  • m=0:左子区间[0,0],右子区间[1,2]
    左颜色:'a'(tL=0),右颜色:只能是混合颜色(tR=1),因为 [1,2] 不是单一颜色。
    cost = dp[0][0][0] + dp[1][2][1] + sum(0,2)K = 0 + 35 + 95 = 35+45 = 80。
  • m=1:左子区间[0,1],右子区间[2,2]
    左颜色:只能是混合颜色(tL=1),因为 [0,1] 不是单一颜色。右颜色:'a'(tR=0)。
    cost = dp[0][1][1] + dp[2][2][0] + sum(0,2)*K = 25 + 0 + 45 = 70。

取最小值,所以 dp[0][2][1] = 70。

最终答案 = min(dp[0][2][0], dp[0][2][1]) = min(INF, 70) = 70,与手工计算一致。


复杂度分析
状态数:O(n²) 个区间,每个区间两个状态(0和1)。
转移时,需要枚举分割点 O(n),以及左右子区间的颜色类型(2×2=4种组合)。
总时间复杂度 O(n³)。空间复杂度 O(n²)。

总结
本题在经典石子合并问题(合并相邻堆的成本与总质量相关)的基础上,增加了颜色属性与合并颜色规则,使得状态需要区分最终颜色是单一原色还是混合色。通过合理设计状态(dp[l][r][0/1])和预处理每个区间是否为单一颜色及其颜色值,可以在 O(n³) 时间内求解。

合并相邻同质片段的最小合并成本问题(每个片段有颜色与质量两个属性) 题目描述 我们有一个由n个片段构成的数组A,每个片段i有两个属性:颜色c[ i](用字符表示)和质量w[ i ](正整数)。目标是反复执行合并操作,每次可以合并两个相邻的片段i和j,生成一个新的片段,新片段将取代原来的两个片段。新片段的颜色由合并规则决定:如果原来两个片段的颜色相同,则新片段颜色保持该颜色;如果颜色不同,则新片段颜色为一个特殊字符'X'(代表混合颜色)。新片段的质量为原来两个片段质量之和。 每次合并的成本定义为:新片段的质量乘以一个与颜色相关的系数。具体来说,如果新片段颜色为颜色a(字符'a'),则成本系数为k_ a(已知正整数);如果新片段颜色为'X',则成本系数为K(已知正整数,通常比单一颜色的系数大,代表混合代价)。 即,合并两个相邻片段i和j的成本为:(w[ i] + w[ j]) * coeff(newColor),其中newColor由上述规则决定,coeff('a') = k_ a,coeff('X') = K。 我们需要将所有片段合并成一个片段,求最小的总合并成本。 示例 假设片段数组:颜色序列 = [ 'a', 'b', 'a'],质量 = [ 2, 3, 4],系数 k_ a = 1, k_ b = 2, K = 5。 一种合并方式: 先合并中间片段'b'(质量3)与右边片段'a'(质量4),颜色不同 → 新颜色'X',质量=7,成本=7 * 5 = 35。新数组变为 [ 'a', 'X'],质量[ 2, 7 ]。 合并剩下的两个片段:颜色'a'与'X'不同 → 新颜色'X',质量=2+7=9,成本=9 * 5 = 45。 总成本 = 35+45 = 80。 另一种合并方式: 先合并左边'a'(2)与'b'(3),颜色不同 → 'X',质量5,成本=5* 5=25。数组变为 [ 'X', 'a'],质量[ 5,4 ]。 合并'X'与'a',颜色不同 → 'X',质量9,成本=9* 5=45。总成本=70。 因此最小成本是70(第二种方式)。 目标是找到最小总成本。 解题过程循序渐进讲解 这是一个典型的区间动态规划问题,因为每次合并相邻片段,最终状态是整个区间合并成一个片段。我们需要考虑合并顺序对总成本的影响,因为合并顺序会影响中间片段的质量与颜色,进而影响后续合并的成本。 步骤1:定义状态 我们定义 dp[ l][ r] 表示将区间 [ l, r ](从第 l 个片段到第 r 个片段,下标从0开始)合并成一个片段所需的最小总成本。 但是,注意到合并后的片段颜色会影响后续与相邻区间合并的成本,而 dp[ l][ r] 仅存储最小成本是不够的,因为不同的合并方式可能产生不同的最终颜色,而后续合并时(当 [ l, r ] 与左边或右边区间合并时)我们需要知道这个颜色才能计算成本。 因此,状态需要额外记录颜色信息。一个常用的技巧是:将颜色作为状态的第三维。但颜色可能取值很多(题目中颜色为字符,但我们可以映射为整数)。实际上,对于区间 [ l, r ] 合并后的最终颜色,只可能是原来该区间中出现的某些颜色,或者是'X'。但为了通用性,我们可以把颜色作为状态的一部分。 然而,这样状态数会很大:dp[ l][ r][ color ],其中 color 可以是所有可能的颜色。但注意到合并规则:如果区间内所有片段颜色相同,则最终颜色就是该颜色;否则,一旦在合并过程中出现两种不同颜色的合并,最终颜色就会变成'X',并且之后无论再与什么合并,颜色永远是'X'(因为'X'与其他任何颜色(包括'X'本身)合并,规则是颜色不同 → 新颜色'X')。 因此,对于区间 [ l, r ],其最终颜色只有两种可能: 单一颜色 col(即区间内所有片段颜色相同,且从未与不同颜色合并过),此时最终颜色就是 col。 混合颜色 'X'。 所以我们只需用两个状态表示即可: dp[ l][ r][ 0]:将区间 [ l, r] 合并成一个片段,且最终颜色为单一颜色(即区间内所有原始片段颜色相同)的最小成本。如果区间内原始片段颜色不完全相同,则 dp[ l][ r][ 0 ] = INF(不可行)。 dp[ l][ r][ 1]:将区间 [ l, r ] 合并成一个片段,且最终颜色为'X'的最小成本。注意,即使区间内原始颜色相同,也可能通过某些合并顺序故意先与外部混合成'X',但这里我们只记录最终颜色为'X'的最小成本。 但这样还需要知道当最终颜色为单一颜色时,具体是哪种颜色,以便计算系数 k_ a。因此,我们可以再细化: 设 color[ l][ r] 表示当区间 [ l, r ] 内所有原始片段颜色相同时的颜色值,否则为特殊标记(如 -1)。 那么,对于 dp[ l][ r][ 0],我们只针对 color[ l][ r] 有定义的情况;对于 dp[ l][ r][ 1 ],总是有定义。 步骤2:状态转移方程 考虑如何将区间 [ l, r] 合并。最后一次合并一定是将左子区间 [ l, m] 和右子区间 [ m+1, r] 合并,其中 m 是分割点(l ≤ m < r)。我们需要枚举这个分割点 m。 对于最终颜色为单一颜色的情况(dp[ l][ r][ 0 ]): 要求区间 [ l, r] 内所有原始片段颜色相同,设为 col。那么左子区间和右子区间的最终颜色都必须为 col,即 dp[ l][ m][ 0] 和 dp[ m+1][ r][ 0 ] 都必须可行,且颜色都是 col。 此时合并后的颜色为 col(因为相同颜色合并后颜色不变),质量 = 总质量 sum(l, r) = w[ l] + ... + w[ r ]。 合并成本 = sum(l, r) * k_ col。 因此: dp[ l][ r][ 0] = min_ {m} { dp[ l][ m][ 0] + dp[ m+1][ r][ 0] + sum(l, r) * k_ col },前提是 color[ l][ m] = color[ m+1][ r ] = col。 对于最终颜色为'X'的情况(dp[ l][ r][ 1 ]): 有两种可能: 左子区间和右子区间合并时,颜色不同(包括一方为'X',另一方为单一颜色;或者双方都是'X';或者双方为不同单一颜色)。此时合并后的颜色一定是'X'。 设左子区间最终颜色为 cL,右子区间最终颜色为 cR,且 cL ≠ cR(注意,如果一方为'X',则必然与另一方不同,因为'X'与任何单一颜色视为不同;'X'与'X'也视为不同?实际上规则:两个颜色相同的合并后颜色不变,两个颜色不同的合并后为'X'。如果两个都是'X',它们颜色相同吗?题目中'X'是一个特殊标记,两个'X'应视为颜色相同,合并后仍为'X'。但这里为了统一,我们可以认为'X'是一种颜色,两个'X'合并后颜色仍为'X',且系数为K。所以在我们的状态中,'X'作为一种颜色处理,其系数为K。 那么,合并成本 = sum(l, r) * coeff(newColor)。这里 newColor 由规则决定:若 cL 和 cR 相同,则 newColor = cL;否则 newColor = 'X'。但因为我们这里考虑的是最终颜色为'X'的情况,所以必须 cL ≠ cR,此时 newColor = 'X',成本 = sum(l, r) * K。 但是,左子区间和右子区间本身的颜色可能为单一颜色或'X'。我们需要它们合并后得到'X',所以要求 cL ≠ cR。 因此,对于给定的 m,我们需要枚举左子区间的最终颜色类型(0或1)和右子区间的最终颜色类型,并检查颜色是否不同。 左子区间和右子区间合并时颜色相同,但都是'X'?如果都是'X',颜色相同,合并后仍为'X',此时成本 = sum(l, r) * K(因为'X'的系数是K)。这种情况也属于最终颜色为'X'。 综合起来,dp[ l][ r][ 1 ] 可以从所有可能的分割点 m 以及左右子区间的颜色组合转移而来,只要合并后的颜色为'X'即可。 更形式化地: 对于每个分割点 m,设左子区间最终颜色为 cL(可能是单一颜色 col1 或 'X'),右子区间最终颜色为 cR(可能是单一颜色 col2 或 'X')。 我们定义 coeff(c) 为颜色 c 对应的系数:如果 c 是单一颜色 a,则 coeff = k_ a;如果 c 是 'X',则 coeff = K。 合并后的颜色 mergeColor = (cL == cR ? cL : 'X')。 如果 mergeColor == 'X',则本次合并成本 = sum(l, r) * K。 那么,总成本 = dp_ left + dp_ right + sum(l, r) * K,其中 dp_ left 是左子区间合并成颜色 cL 的最小成本,dp_ right 是右子区间合并成颜色 cR 的最小成本。 我们需要枚举所有可能的 (cL, cR) 组合,使得 mergeColor == 'X',然后取最小值。 但是,为了简化,我们可以将 dp[ l][ r][ 0] 只用于单一颜色相同的情况,而 dp[ l][ r][ 1] 表示最终颜色为'X'的最小成本,而不关心其内部是否曾经是单一颜色。那么,对于 dp[ l][ r][ 1 ] 的转移,我们可以考虑: 左子区间最终颜色可以是单一颜色(如果可行)或'X',右子区间同样。只要左右颜色不同,合并后即为'X'。 左右颜色相同但都是'X',合并后也是'X'。 因此,转移方程可以写成: dp[ l][ r][ 1] = min_ {m, tL, tR} { dp[ l][ m][ tL] + dp[ m+1][ r][ tR] + sum(l, r) * K } 其中 tL, tR ∈ {0,1},但需要满足: 如果 tL=0 且 tR=0,则要求 color[ l][ m] ≠ color[ m+1][ r](因为如果相同则合并后颜色为单一颜色,不属于dp[ l][ r][ 1 ]); 如果 tL=0 且 tR=1,则总是满足(因为单一颜色与'X'不同); 如果 tL=1 且 tR=0,总是满足; 如果 tL=1 且 tR=1,则总是满足(两个'X'相同,但合并后仍为'X',成本系数为K,所以也属于dp[ l][ r][ 1 ])。 另外,dp[ l][ r][ 0 ] 的转移如前所述,只在区间内所有片段颜色相同时才可能。 步骤3:初始化 对于长度为1的区间(l == r): dp[ l][ l][ 0] = 0(已经是一个片段,无需合并,成本为0),且 color[ l][ l] = c[ l ]。 dp[ l][ l][ 1] = INF(不可能通过合并得到'X',因为只有一个片段,其颜色就是原始颜色,不是'X'),除非原始颜色就是'X'?但题目中原始片段颜色不会是'X','X'只作为混合后的颜色出现。所以 dp[ l][ l][ 1 ] = INF。 步骤4:计算顺序 按区间长度从小到大计算,从长度2到n。 步骤5:最终答案 整个区间 [ 0, n-1] 合并成一个片段的最小成本是 min(dp[ 0][ n-1][ 0], dp[ 0][ n-1][ 1 ])。 实例演算(用之前示例) n=3,颜色 c = [ 'a', 'b', 'a'],质量 w = [ 2,3,4],k_ a=1, k_ b=2, K=5。 预处理 color[ l][ r ]: color[ 0][ 0]='a', color[ 1][ 1]='b', color[ 2][ 2 ]='a'。 color[ 0][ 1 ]:颜色不同,为 -1(表示不是单一颜色)。 color[ 1][ 2 ]:颜色不同,为 -1。 color[ 0][ 2 ]:颜色不全相同,为 -1。 预处理 sum(l,r): sum(0,0)=2, sum(1,1)=3, sum(2,2)=4, sum(0,1)=5, sum(1,2)=7, sum(0,2)=9。 初始化 dp[ l][ l][ 0]=0, dp[ l][ l][ 1 ]=INF。 长度2的区间: 区间 [ 0,1 ](颜色 a,b) 单一颜色情况:color[ 0][ 1] = -1,所以 dp[ 0][ 1][ 0 ] = INF。 混合颜色情况(dp[ 0][ 1][ 1 ]):枚举分割点 m=0(唯一可能)。 左子区间[ 0,0]颜色为'a'(tL=0),右子区间[ 1,1]颜色为'b'(tR=0),且 color[ 0][ 0] ≠ color[ 1][ 1 ],所以符合条件。 cost = dp[ 0][ 0][ 0] + dp[ 1][ 1][ 0] + sum(0,1) K = 0 + 0 + 5 5 = 25。 所以 dp[ 0][ 1][ 1 ] = 25。 区间 [ 1,2 ](颜色 b,a) dp[ 1][ 2][ 0 ] = INF(颜色不同)。 dp[ 1][ 2][ 1]:m=1,左子区间[ 1,1]颜色'b',右子区间[ 2,2 ]颜色'a',不同。 cost = 0+0 + sum(1,2) K = 7 5 = 35。 所以 dp[ 1][ 2][ 1 ] = 35。 长度3的区间 [ 0,2 ]: 先计算 dp[ 0][ 2][ 0]:要求颜色相同,但 color[ 0][ 2 ] = -1,所以 INF。 dp[ 0][ 2][ 1 ]:枚举分割点 m=0 和 m=1。 m=0:左子区间[ 0,0],右子区间[ 1,2 ] 左颜色:'a'(tL=0),右颜色:只能是混合颜色(tR=1),因为 [ 1,2 ] 不是单一颜色。 cost = dp[ 0][ 0][ 0] + dp[ 1][ 2][ 1] + sum(0,2) K = 0 + 35 + 9 5 = 35+45 = 80。 m=1:左子区间[ 0,1],右子区间[ 2,2 ] 左颜色:只能是混合颜色(tL=1),因为 [ 0,1 ] 不是单一颜色。右颜色:'a'(tR=0)。 cost = dp[ 0][ 1][ 1] + dp[ 2][ 2][ 0] + sum(0,2)* K = 25 + 0 + 45 = 70。 取最小值,所以 dp[ 0][ 2][ 1 ] = 70。 最终答案 = min(dp[ 0][ 2][ 0], dp[ 0][ 2][ 1 ]) = min(INF, 70) = 70,与手工计算一致。 复杂度分析 状态数:O(n²) 个区间,每个区间两个状态(0和1)。 转移时,需要枚举分割点 O(n),以及左右子区间的颜色类型(2×2=4种组合)。 总时间复杂度 O(n³)。空间复杂度 O(n²)。 总结 本题在经典石子合并问题(合并相邻堆的成本与总质量相关)的基础上,增加了颜色属性与合并颜色规则,使得状态需要区分最终颜色是单一原色还是混合色。通过合理设计状态(dp[ l][ r][ 0/1 ])和预处理每个区间是否为单一颜色及其颜色值,可以在 O(n³) 时间内求解。