Write a function to compute the highest stack of boxes that can be created from a list of boxes.
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from random import randint
 | |
| 
 | |
| class Box(object):
 | |
|     def __init__(self, w, h, d):
 | |
|         self.width  = w
 | |
|         self.depth  = d
 | |
|         self.height = h
 | |
| 
 | |
|     def __repr__(self):
 | |
|         return "{}x{}x{}".format(self.width, self.depth, self.height)
 | |
| 
 | |
|     def lt(self, b):
 | |
|         return all([
 | |
|             self.width  < b.width,
 | |
|             self.height < b.height,
 | |
|             self.depth  < b.depth,
 | |
|         ])
 | |
| 
 | |
|     def gt(self, b):
 | |
|         return all([
 | |
|             self.width  > b.width,
 | |
|             self.height > b.height,
 | |
|             self.depth  > b.depth,
 | |
|         ])
 | |
| 
 | |
| def random_box():
 | |
|     return Box(
 | |
|         randint(1, 10),
 | |
|         randint(1, 10),
 | |
|         randint(1, 10),
 | |
|     )
 | |
| 
 | |
| xs = [random_box() for _ in range(5)]
 | |
| 
 | |
| def highest_stack(xs, cache={}):
 | |
|     if not xs:
 | |
|         return 0
 | |
|     heights = []
 | |
|     for i in range(len(xs)):
 | |
|         x, rest = xs[i], xs[0:i] + xs[i+1:]
 | |
|         if cache and x in cache:
 | |
|             height = cache[x]
 | |
|         else:
 | |
|             height = x.height + highest_stack([b for b in rest if x.gt(b)], cache)
 | |
|             cache[x] = height
 | |
|         heights += [height]
 | |
|     return max(heights)
 | |
| 
 | |
| print(xs)
 | |
| print(highest_stack(xs))
 |