那么我们考虑之前的弱化版的 DP方程
d
p
[
i
]
[
j
]
表
示
从
i
到
j
全
部
合
并
成
1
个
后
的
数
值
dp[i][j]表示从i到j 全部合并成1个后的数值
dp[i][j]表示从i到j全部合并成1个后的数值
为此我们也花费了 n3 的时间,那么我们考虑可不可以优化一下。
长度能用别的取代吗?或者长度对结果有贡献吗? 长度显然可以通过
l
e
n
=
r
−
l
+
1
len=r-l+1
len=r−l+1 得到。所以我们记录r就行了
那么
l
l
l和
r
r
r之间可以舍弃一个吗?
这个就需要树剖的思想了。(习惯问题,我选择换
r
r
r)见图1
那么我们就可以通过这个考虑一下如何“舍弃”
r
r
r了。
思路 见图2
综上所述,我们可以得到DP方程:
d
p
[
i
]
[
x
]
表
示
以
x
为
起
点
能
“
完
全
合
并
”
成
i
的
右
端
点
位
置
dp[i][x]表示以x为起点能 “完全合并 ”成i的右端点位置
dp[i][x]表示以x为起点能“完全合并”成i的右端点位置
在图2中,
d
p
[
i
−
1
]
[
x
1
]
=
y
1
dp[i-1][x1]=y1
dp[i−1][x1]=y1 ,
d
p
[
i
−
1
]
[
x
2
]
=
y
2
dp[i-1][x2]=y2
dp[i−1][x2]=y2 ,
d
p
[
i
]
[
x
1
]
=
y
2
dp[i][x1]=y2
dp[i][x1]=y2
SO,转移方程:
d
p
[
i
]
[
x
]
=
d
p
[
i
−
1
]
[
d
p
[
i
−
1
]
[
x
]
]
dp[i][x]=dp[i-1][dp[i-1][x]]
dp[i][x]=dp[i−1][dp[i−1][x]]