算法笔试-编程练习-好题-04

题目:堆盒子

礼盒大小不同,我们玩堆盒子的游戏,怎么堆盒子使得堆出的高度最高,每个礼盒的大小由长、宽、高表示,堆盒子的时候要求下面的盒子长、宽、高都必须大于上面的盒子,不包含等于。高度为堆出的礼盒的所有高度的总和。

输入描述

输入的第一行是礼盒的个数N,

接下来输入N行,每行表示每个礼盒的长、宽、高。

礼盒的数量不超过1000个,每个盒子的长、宽、高取值范围为1~10。

输出描述

输出一行,输出能堆出盒子的最高高度

样例

输入

4
1 1 1
2 3 4
3 6 7
4 5 6

输出

12

说明

选择1、2、33个盒子堆出的高度最高,1+4+7=12

题目分析:

【题目类型:动态规划,多维动规】

我们按照盒子从小到大的顺序计算动态规划,维护一个DP[l][w][h]的三维数组,用来描述最大的盒子的尺寸为l、w、h时的最大总高度。

状态转移方程为如果存在高度为h的盒子,那么DP[l][w][h] = max(DP[l-1][w][h], DP[l][w-1][h],DP[l][w][h-1], DP[l-1][w-1][h-1]+h ),若不存在则去掉最后一种情况,DP[l][w][h] = max(DP[l-1][w][h], DP[l][w-1][h],DP[l][w][h-1])

代码:

n = int(input())
grid = [[[] for _ in range(11)] for __ in range(11)]
DP = [[[0 for _ in range(11)] for __ in range(11)] for ___ in range(11)]
for _ in range(n):
    l, w, h = map(int,input().split())
    grid[l][w].append(h) 

# for g in grid:
#     print(g)
    
for l in range(1, 11):
    for w in range(1, 11):
        for h in range(1, 11):
            if h in grid[l][w]:
                DP[l][w][h] = max(DP[l-1][w][h], DP[l][w-1][h], DP[l][w][h-1], DP[l-1][w-1][h-1]+h)
            else:
                DP[l][w][h] = max(DP[l-1][w][h], DP[l][w-1][h], DP[l][w][h-1])
            
                    

print(max(DP[10][10]))

你可能感兴趣的:(大厂校招-编程集训,算法,大厂笔试,动态规划,堆盒子)