1. Título
Pila de cajas. Te doy un montón de n cajas, la caja es ancha, profunda, alta, alta.
Las cajas no se pueden voltear. Al apilar las cajas, el ancho, la altura y la profundidad de la caja inferior deben ser mayores que la caja superior.
Implemente un método para construir la pila de cajas más alta . La altura de la pila de cajas es la suma de la altura de cada caja .
输入使用数组[wi, di, hi]表示每个箱子。
示例1:
输入:box = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
输出:6
示例2:
输入:box = [[1, 1, 1], [2, 3, 4], [2, 6, 7], [3, 4, 5]]
输出:10
提示:
箱子的数目不大于3000个。
Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/pile-box-lcci El
copyright pertenece a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.
2. Resolución de problemas
-
Preguntas similares:
LeetCode 354. Problema con el sobre ruso Matryoshka (suborden ascendente más largo DP / búsqueda binaria)
entrevistador programador código de oro-entrevista pregunta 17.08. Circus Tower (suborden ascendente más largo DP / búsqueda binaria)
aplicación de programación dinámica - Subsecuencia de mayor crecimiento LeetCode 300 -
Ordenar una dimensión en orden descendente
-
El resto es similar a la subsecuencia creciente más larga, excepto que la solución no es la longitud, sino la suma máxima.
class Solution {
public:
int pileBox(vector<vector<int>>& box) {
sort(box.begin(), box.end(),[&](auto a, auto b) {
return a[0] > b[0];//宽降序
});
int i, j, n = box.size();
vector<int> dp(n,0);//以i箱子为顶的最大高度
for(i = 0; i < n; ++i)
{
dp[i] = box[i][2];//初始化自身高度
for(j = 0; j < i; ++j)//跟前面的比较
{
if(box[i][0] < box[j][0] && box[i][1] < box[j][1]
&& box[i][2] < box[j][2])//满足条件
{
dp[i] = max(dp[i], box[i][2]+dp[j]);//可以叠加,取最大的
}
}
}
return *max_element(dp.begin(),dp.end());
}
};
280 ms 16,7 MB