d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]:前
i
i
i个村庄建
j
j
j个邮局的最小距离.
m
[
i
]
[
j
]
m[i][j]
m[i][j]:村庄
[
i
,
j
]
[i,j]
[i,j]之间建立一个邮局的最小距离.(想象: 很明显应该建在
(
i
+
j
)
/
2
(i+j)/2
(i+j)/2的邮局上)
目标状态:
d
p
[
V
]
[
P
]
dp[V][P]
dp[V][P].即前
V
V
V个村庄建立
P
P
P个邮局.
状态转移:
子问题:
定义:
b
u
i
l
d
(
s
,
e
,
j
)
:
=
build(s,e,j):=
build(s,e,j):=在村庄
[
s
,
e
]
[s,e]
[s,e] 间建
j
j
j个邮局
b
u
i
l
d
(
1
,
i
,
j
)
:
=
⋃
k
=
1
i
−
1
{
b
u
i
l
d
(
1
,
k
,
j
−
1
)
∩
b
u
i
l
d
(
k
+
1
,
i
,
1
)
}
build(1,i,j):=\bigcup_{k=1}^{i-1} \{build(1,k , j-1)\cap build(k+1, i, 1)\}
build(1,i,j):=⋃k=1i−1{build(1,k,j−1)∩build(k+1,i,1)}
因此有: 状态转移方程:
d
p
[
i
]
[
j
]
=
m
a
x
{
d
p
[
k
]
[
j
−
1
]
+
m
[
k
+
1
]
[
i
]
∣
1
<
=
k
<
=
i
−
1
}
dp[i][j] = max\{dp[k][j-1]+m[k+1][i]\quad | \quad 1<=k<=i-1\}
dp[i][j]=max{dp[k][j−1]+m[k+1][i]∣1<=k<=i−1}(这里默认了每一个子问题下,最优情况为: 前
k
k
k个村庄只往前
j
−
1
j-1
j−1个邮局前进,如果是要往第
j
j
j个邮局,这种情况包含在其他子问题下)因此状态转移最终结果没有问题。
m
[
i
]
[
j
]
=
m
[
i
]
[
j
−
1
]
+
a
[
j
]
−
a
[
(
i
+
j
)
/
2
]
m[i][j] = m[i][j-1]+a[j]-a[(i+j)/2]
m[i][j]=m[i][j−1]+a[j]−a[(i+j)/2](想象可得出)
转移策略: 先求出所有的
m
m
m,
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]只依赖与
d
p
[
i
′
]
[
j
−
1
]
dp[i'][j-1]
dp[i′][j−1],因此只需循环更新下三角矩阵。
初始状态:
d
p
[
i
]
[
1
]
=
m
[
1
]
[
i
]
,
d
p
[
i
]
[
0
]
=
i
n
f
dp[i][1] = m[1][i], dp[i][0]=inf
dp[i][1]=m[1][i],dp[i][0]=inf