动态规划
状态计算 :
f
[
i
]
=
{
c
u
b
o
i
d
s
[
i
]
[
2
]
if
不
存
在
k
m
a
x
(
f
[
k
]
)
+
c
u
b
o
i
d
s
[
i
]
[
2
]
if
k
∈
[
1
,
i
−
1
]
f[i] = \begin{cases} cuboids[i][2] &\text{if } 不存在k \\ max(f[k])+cuboids[i][2] &\text{if } k \in [1,i-1] \end{cases}
f[i]={cuboids[i][2]max(f[k])+cuboids[i][2]if 不存在kif k∈[1,i−1]
其中 c u b o i d s [ i ] [ 2 ] cuboids[i][2] cuboids[i][2] 表示 i i i 的高度。
设长方体
A
A
A 的宽长高为
w
1
,
l
1
,
h
1
w_1,l_1,h_1
w1,l1,h1 ,
B
B
B 的宽长高为
w
2
,
l
2
,
h
2
w_2,l_2,h_2
w2,l2,h2
解题需要的性质 : 若
w
1
≤
l
1
≤
h
1
,
w
2
≤
l
2
≤
h
2
w_1\le l_1 \le h_1,w_2\le l_2 \le h_2
w1≤l1≤h1,w2≤l2≤h2 ,要
A
A
A 可以堆叠在
B
B
B 上,当且仅当
w
1
≤
w
2
w_1\le w_2
w1≤w2 且
l
1
≤
l
2
l_1\le l_2
l1≤l2 且
h
1
≤
h
2
h_1\le h_2
h1≤h2 。
证明 :
①满足
w
1
≤
w
2
w_1\le w_2
w1≤w2 且
l
1
≤
l
2
l_1\le l_2
l1≤l2 且
h
1
≤
h
2
h_1\le h_2
h1≤h2 ,一定是符合题意的堆叠方案。
②要证明仅当,可以反证,假设当
w
1
>
w
2
w_1>w_2
w1>w2 或
l
1
>
l
2
l_1>l_2
l1>l2 或
h
1
>
h
2
h_1>h_2
h1>h2 ,
A
A
A 可以堆在
B
B
B 上,
- 当
w
1
>
w
2
w_1>w_2
w1>w2 ,
有 w 2 < w 1 ≤ l 1 ≤ h 1 w_2<w_1\le l_1\le h_1 w2<w1≤l1≤h1 ,
仅当 l 1 ≥ l 2 l_1\ge l_2 l1≥l2 且 h 1 ≥ h 2 h_1\ge h_2 h1≥h2 ,可以堆叠(包含在原命题),( w 1 > w 2 w_1>w_2 w1>w2 且 l 1 ≥ l 2 l_1\ge l_2 l1≥l2 且 h 1 ≥ h 2 h_1\ge h_2 h1≥h2)
其他情况不可堆叠。 - 当
l
1
>
l
2
l_1>l_2
l1>l2 ,
因为 w 1 ≤ l 1 ≤ h 1 w_1\le l_1\le h_1 w1≤l1≤h1 , w 2 ≤ l 2 ≤ h 2 w_2\le l_2\le h_2 w2≤l2≤h2 ,
有 w 2 ≤ l 2 < l 1 ≤ h 1 w_2\le l_2 <l_1\le h_1 w2≤l2<l1≤h1 ,
则 w 2 w_2 w2 和 l 2 l_2 l2 只能与 w 1 w_1 w1 匹配,
但 w 1 w_1 w1 只可匹配其中之一,
不可以堆叠。 - 当
h
1
>
h
2
h_1>h_2
h1>h2 ,
有 w 2 ≤ l 2 ≤ h 2 < h 1 w_2\le l_2\le h_2<h_1 w2≤l2≤h2<h1
仅当 w 1 ≥ w 2 w_1\ge w_2 w1≥w2 且 l 1 ≥ l 2 l_1\ge l_2 l1≥l2 ,可以堆叠(包含在原命题)
其他情况不可堆叠。
综上,只有原命题成立,反证的结论才能成立,否则反证不成立。所以原命题成立。
class Solution {
public:
int maxHeight(vector<vector<int>>& cuboids) {
for(auto &c:cuboids) sort(c.begin(),c.end());
sort(cuboids.begin(),cuboids.end());
int n = cuboids.size();
vector<int> f(n,0);
int ans = 0;
for(int i = 0;i<n;i++){
f[i] = cuboids[i][2];
for(int j = 0;j<i;j++)
if(cuboids[i][1]>=cuboids[j][1]&&cuboids[i][2]>=cuboids[j][2])
f[i] = max(f[i],f[j]+cuboids[i][2]);
ans = max(ans,f[i]);
}
return ans;
}
};
- 时间复杂度 : O ( n 2 ) O(n^2) O(n2) , n n n 是长方体的数量,状态数量是 n n n ,转移数量是 n n n ,状态转移的时间复杂度 O ( n 2 ) O(n^2) O(n2) 。
- 空间复杂度 : O ( n ) O(n) O(n) ,所有状态的空间复杂度 O ( n ) O(n) O(n) 。
AC
致语
- 理解思路很重要
- 读者有问题请留言,清墨看到就会回复的。