from typing import List

def rod_cutting(prices: List[int],length: int) -> int:
	"""
	Given a rod of length n and array of prices that indicate price at each length.
	Determine the maximum value obtainable by cutting up the rod and selling the pieces
	
	>>> rod_cutting([1,5,8,9],4) 
	10
	>>> rod_cutting([1,1,1],3) 
	3
	>>> rod_cutting([1,2,3], -1)
	Traceback (most recent call last):
   	ValueError: Given integer must be greater than 1, not -1
   	>>> rod_cutting([1,2,3], 3.2)
	Traceback (most recent call last):
   	TypeError: Must be int, not float
   	>>> rod_cutting([], 3)
	Traceback (most recent call last):
   	AssertionError: prices list is shorted than length: 3
	
	

	Args:
		prices: list indicating price at each length, where prices[0] = 0 indicating rod of zero length has no value
	    length: length of rod

	Returns:
	    Maximum revenue attainable by cutting up the rod in any way. 
	"""

	prices.insert(0, 0)
	if not isinstance(length, int):
	    raise TypeError('Must be int, not {0}'.format(type(length).__name__))
	if length < 0: 
	    raise ValueError('Given integer must be greater than 1, not {0}'.format(length))
	assert len(prices) - 1 >= length, "prices list is shorted than length: {0}".format(length) 

	return rod_cutting_recursive(prices, length)

def rod_cutting_recursive(prices: List[int],length: int) -> int:
	#base case 
	if length == 0:
		return 0
	value = float('-inf')
	for firstCutLocation in range(1,length+1):
		value = max(value, prices[firstCutLocation]+rod_cutting_recursive(prices,length - firstCutLocation))
	return value


def main():
	assert rod_cutting([1,5,8,9,10,17,17,20,24,30],10) == 30
	# print(rod_cutting([],0))

if __name__ == '__main__':
	main()