classSolution{public:intget_dp(vector<int>& dp,int left,int right){if(left > right)return1;if(dp[right - left +1]!=-1)return dp[right - left +1];int ret =0;for(int i = left;i <= right;++i){auto l =get_dp(dp,left,i-1);auto r =get_dp(dp,i+1,right);
ret += l * r;}
dp[right - left +1]= ret;return ret;}intnumTrees(int n){
vector<int>dp(n+1,-1);int ret =0;for(int i =1;i <= n;++i){auto left =get_dp(dp,1,i-1);auto right =get_dp(dp,i+1,n);
ret += left * right;}return ret;}};
代码实现(四刷自解 DAY 312 C++)
classSolution{public:intGetAns(vector<int>& dp,int left,int right,int pos){if(left == right)return1;int l = dp[pos - left];int r = dp[right - pos];if(l ==-1){
l =0;for(int i = left; i < pos;++i){
l +=GetAns(dp, left, pos, i);}
dp[pos - left]= l;}if(r ==-1){
r =0;for(int i = pos +1; i <= right;++i){
r +=GetAns(dp, pos +1, right, i);}
dp[right - pos]= r;}return l * r;}intnumTrees(int n){
vector<int>dp(n +1,-1);
dp[0]=1;int ans =0;for(int i =1; i <= n;++i){
ans +=GetAns(dp,1, n, i);}return ans;}};