|  | @@ -0,0 +1,47 @@
 | 
	
		
			
				|  |  | +const MAX_N int = 100
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +var dp map[int]int
 | 
	
		
			
				|  |  | +var length []int
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func removeBoxes(boxes []int) int {
 | 
	
		
			
				|  |  | +	n := len(boxes)
 | 
	
		
			
				|  |  | +	dp = make(map[int]int)
 | 
	
		
			
				|  |  | +	length = make([]int, n)
 | 
	
		
			
				|  |  | +	for i := 1; i < n; i++ {
 | 
	
		
			
				|  |  | +		if boxes[i] == boxes[i-1] {
 | 
	
		
			
				|  |  | +			length[i] = length[i-1] + 1
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return dfs(boxes, 0, len(boxes)-1, 0)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func dfs(boxes []int, l, r, k int) int {
 | 
	
		
			
				|  |  | +	// dp[l][r][k] = dp[l][r-1][0] + (k+1)^2, drop box[r]
 | 
	
		
			
				|  |  | +	//             = dp[l][p][k+1] + dp[p+1][r-1][0],
 | 
	
		
			
				|  |  | +	// box[p] == box[j], remove boxes at [p+1, r-1] and attach
 | 
	
		
			
				|  |  | +	// box[j] to box[p]
 | 
	
		
			
				|  |  | +	if r < l {
 | 
	
		
			
				|  |  | +		return 0
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	k += length[r]
 | 
	
		
			
				|  |  | +	r -= length[r]
 | 
	
		
			
				|  |  | +	key := ((l*MAX_N)+r)*MAX_N + k
 | 
	
		
			
				|  |  | +	if val, ok := dp[key]; ok {
 | 
	
		
			
				|  |  | +		return val
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	res := dfs(boxes, l, r-1, 0) + (k+1)*(k+1)
 | 
	
		
			
				|  |  | +	for i := l; i < r; i++ {
 | 
	
		
			
				|  |  | +		if boxes[i] == boxes[r] {
 | 
	
		
			
				|  |  | +			res = maxInt(res, dfs(boxes, l, i, k+1)+dfs(boxes, i+1, r-1, 0))
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	dp[key] = res
 | 
	
		
			
				|  |  | +	return res
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func maxInt(x, y int) int {
 | 
	
		
			
				|  |  | +	if x < y {
 | 
	
		
			
				|  |  | +		return y
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return x
 | 
	
		
			
				|  |  | +}
 |