题面描述
数字三角形就不给题面了
T1
完全背包问题,相当于对n种物品给无限个价值为
c
i
c_i
ci的物品,它的体积为
a
i
a_i
ai,在不超过背包容量上限
b
b
b的情况下,求能获得的最大价值,
x
i
x_i
xi相当于能获得这个物品的个数。
设
f
[
i
]
[
j
]
f[i][j]
f[i][j]代表前
i
i
i 个物品,容量不超
j
j
j能获得的最大价值,对每个整数枚举
x
i
x_i
xi
f
[
i
]
[
j
]
=
m
a
x
{
f
[
i
−
1
]
[
j
]
j
<
m
i
n
(
a
i
,
b
)
f
[
i
]
[
j
−
a
i
]
+
c
i
a
i
≤
j
≤
b
f[i][j] = max\begin{cases} f[i-1][j]&j<min(a_i,b)\\ f[i][j-a_i]+c_i&a_i \leq j \leq b \end{cases}
f[i][j]=max{f[i−1][j]f[i][j−ai]+cij<min(ai,b)ai≤j≤b
满足
j
−
a
i
⋅
x
i
≥
0
j-a_i\cdot x_i \geq 0
j−ai⋅xi≥0
状态共有
b
n
bn
bn个,转移时间
O
(
1
)
O(1)
O(1),总时间复杂度
O
(
b
n
)
O(bn)
O(bn)
T2
数字三角形问题,不说了(
f
o
r
for
for
i
=
1
i=1
i=1
t
o
to
to
n
n
n
d
o
do
do
f
o
r
for
for
j
=
1
j=1
j=1
t
o
to
to
i
i
i
d
o
do
do
i
f
if
if
j
>
1
j>1
j>1
t
h
e
n
then
then
f
[
i
]
[
j
]
←
m
a
x
(
f
[
i
−
1
]
[
j
−
1
]
,
f
[
i
−
1
]
[
j
]
)
+
v
a
l
u
e
[
i
]
[
j
]
f[i][j] \leftarrow max(f[i-1][j-1],f[i-1][j])+value[i][j]
f[i][j]←max(f[i−1][j−1],f[i−1][j])+value[i][j]
e
l
s
e
else
else
f
[
i
]
[
j
]
←
f
[
i
−
1
]
[
j
]
+
v
a
l
u
e
[
i
]
[
j
]
f[i][j] \leftarrow f[i-1][j]+value[i][j]
f[i][j]←f[i−1][j]+value[i][j]
e
n
d
i
f
endif
endif
e
n
d
f
o
r
endfor
endfor
e
n
d
f
o
r
endfor
endfor
a
n
s
w
e
r
←
m
a
x
answer \leftarrow max
answer←max
f
[
n
]
[
i
]
f[n][i]
f[n][i]
状态数
O
(
n
2
)
O(n^2)
O(n2),转移复杂度
O
(
1
)
O(1)
O(1),总时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
T3
游艇出租问题
f
[
i
]
f[i]
f[i]代表当前停靠在
i
i
i处的最小租金
做法是枚举一个上一个停靠的位置
j
j
j,然后取
m
i
n
min
min
f
o
r
for
for
i
=
1
i=1
i=1
t
o
to
to
n
n
n
d
o
do
do
f
[
i
]
←
I
n
f
f[i] \leftarrow Inf
f[i]←Inf
e
n
d
f
o
r
endfor
endfor
f
[
1
]
←
0
f[1] \leftarrow 0
f[1]←0
f
o
r
for
for
i
=
2
i=2
i=2
t
o
to
to
n
n
n
d
o
do
do
f
o
r
for
for
j
=
1
j=1
j=1
t
o
to
to
i
−
1
i-1
i−1
d
o
do
do
f
[
i
]
←
m
i
n
(
f
[
i
]
,
f
[
j
]
+
r
e
n
t
[
j
]
[
i
]
)
f[i] \leftarrow min(f[i],f[j]+rent[j][i])
f[i]←min(f[i],f[j]+rent[j][i])
e
n
d
f
o
r
endfor
endfor
e
n
d
f
o
r
endfor
endfor
a
n
s
w
e
r
←
f
[
n
]
answer \leftarrow f[n]
answer←f[n]
状态数
O
(
n
)
O(n)
O(n),转移复杂度
O
(
n
)
O(n)
O(n),总时间复杂度
O
(
n
2
)
O(n^2)
O(n2)