dp 如果我们直接定义状态: \(dp[i][t1][t2][t3][h1][h2][h3]\) 表示前i个,第一层宽度为t1,,第二层宽度为t2,第三层宽度为t3,第一层高度为h1,第二层高度为h2,第三层高度为h3的最小面积。 如果直接这样定义,你会发现,你不仅内存炸飞,时间也会T的飞起。 考虑优化状态。 1.首先,你会发现,面积可以直接用t1,t2,t3,h1,h2,h3算出来,所以我们不妨砍掉一维 2.列一波状态转移方程,你会发现,i只会从i-1转移过来,于是又可以把第一维滚动 3.不难发现, \(t1+t2+t3=\sum _{j=1}^{j \le i} t_j\) 于是只用知道t1,t2,t3中的任意两个,就可以推出第三个 那么,状态就优化成了: \(dp[0/1][t1][t2][h1][h2]\) 表示前i个,第一层宽度为t1,,第二层宽度为t2,第一层高度为h1,第二层高度为h2,的第三层最小高度。 然后,你又会发现,内存和时间依旧承受不住。。。 仔细琢磨一下,不难观察到,每一层的高度是 这一层中所放书本的最大值 ,那么如果按照一定顺序插入书本,高度不就可以省略掉了吗? 因此,我们先把书本按高度 从大到小 排个序,这样每层的高度就是第一次插入到这层书的高度,于是状态又优化成了: \(dp[0/1][t1][t2]\) 表示前i个,第一层宽度为t1