classSolution{public:intgetMoneyAmount(intn){// dp[i][j] := min money you need to guarantee a win of picking i..jdp.resize(n+1,vector<int>(n+1,INT_MAX));returngetMoneyAmount(1,n);}private:vector<vector<int>>dp;intgetMoneyAmount(inti,intj){if(i>=j)return0;if(dp[i][j]!=INT_MAX)returndp[i][j];for(intk=i;k<=j;++k)dp[i][j]=min(dp[i][j],max(getMoneyAmount(i,k-1),getMoneyAmount(k+1,j))+k);returndp[i][j];}};
classSolution{publicintgetMoneyAmount(intn){// dp[i][j] := min money you need to guarantee a win of picking i..jdp=newint[n+1][n+1];Arrays.stream(dp).forEach(A->Arrays.fill(A,Integer.MAX_VALUE));returngetMoneyAmount(1,n);}privateint[][]dp;privateintgetMoneyAmount(inti,intj){if(i>=j)return0;if(dp[i][j]!=Integer.MAX_VALUE)returndp[i][j];for(intk=i;k<=j;++k)dp[i][j]=Math.min(dp[i][j],Math.max(getMoneyAmount(i,k-1),getMoneyAmount(k+1,j))+k);returndp[i][j];}}
classSolution:defgetMoneyAmount(self,n:int)->int:# Dp(i, j) := min money you need to guarantee a win of picking i..j@functools.lru_cache(None)defdp(i:int,j:int)->int:ifi>=j:return0ans=math.infforkinrange(i,j+1):ans=min(ans,max(dp(i,k-1),dp(k+1,j))+k)returnansreturndp(1,n)