classSolution{public:intremoveBoxes(vector<int>&boxes){constintn=boxes.size();// dp[i][j][k] := max score of boxes[i..j] if k boxes eqaul to boxes[j]dp.resize(n,vector<vector<int>>(n,vector<int>(n)));returnremoveBoxes(boxes,0,n-1,0);}private:vector<vector<vector<int>>>dp;intremoveBoxes(constvector<int>&boxes,inti,intj,intk){if(i>j)return0;if(dp[i][j][k])returndp[i][j][k];intr=j;intsameBoxes=k+1;while(r>0&&boxes[r-1]==boxes[r]){--r;++sameBoxes;}dp[i][j][k]=removeBoxes(boxes,i,r-1,0)+sameBoxes*sameBoxes;for(intp=i;p<r;++p)if(boxes[p]==boxes[r])dp[i][j][k]=max(dp[i][j][k],removeBoxes(boxes,i,p,sameBoxes)+removeBoxes(boxes,p+1,r-1,0));returndp[i][j][k];}};
classSolution{publicintremoveBoxes(int[]boxes){finalintn=boxes.length;// dp[i][j][k] := max score of boxes[i..j] if k boxes eqaul to boxes[j]dp=newint[n][n][n];returnremoveBoxes(boxes,0,n-1,0);}privateint[][][]dp;privateintremoveBoxes(int[]boxes,inti,intj,intk){if(i>j)return0;if(dp[i][j][k]>0)returndp[i][j][k];intr=j;intsameBoxes=k+1;while(r>0&&boxes[r-1]==boxes[r]){--r;++sameBoxes;}dp[i][j][k]=removeBoxes(boxes,i,r-1,0)+sameBoxes*sameBoxes;for(intp=i;p<r;++p)if(boxes[p]==boxes[r])dp[i][j][k]=Math.max(dp[i][j][k],removeBoxes(boxes,i,p,sameBoxes)+removeBoxes(boxes,p+1,r-1,0));returndp[i][j][k];}}
classSolution:defremoveBoxes(self,boxes:List[int])->int:# Dp(i, j, k) := max score of boxes[i..j] if k boxes equal to boxes[j]@functools.lru_cache(None)defdp(i:int,j:int,k:int)->int:ifi>j:return0r=jsameBoxes=k+1whiler>0andboxes[r-1]==boxes[r]:r-=1sameBoxes+=1ans=dp(i,r-1,0)+sameBoxes*sameBoxesforpinrange(i,r):ifboxes[p]==boxes[r]:ans=max(ans,dp(i,p,sameBoxes)+dp(p+1,r-1,0))returnansreturndp(0,len(boxes)-1,0)