Topic:递归+DP
Question:
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
方法:
方法和Fibonacci的处理如出一辙。
Code:
//纯递归
public class Solution {
public int numTrees(int n) {
// Start typing your Java solution below
// DO NOT write main() function
int sum = 0;
if(n == 0 || n == 1) return 1;
else
for(int i=0; i<n; i++)
sum += numTrees(i)*numTrees(n-i-1);
return sum;
}
}
//顺序DP
public class Solution {
public int numTrees(int n) {
// Start typing your Java solution below
// DO NOT write main() function
int[] dp = new int[n+1];
dp[0] = 1;
for(int i=1; i<=n; i++){
for(int j=0; j<i; j++)
dp[i] += dp[j]*dp[i-1-j];
}
return dp[n];
}
}
//递归DP
public class Solution {
public int numTrees(int n) {
// Start typing your Java solution below
// DO NOT write main() function
int[] dp = new int[n+1];
return recImp(dp, n);
}
private int recImp(int[] dp, int n){
if(n == 0 || n == 1) return 1;
if(dp[n] != 0) return dp[n];
for(int i=0; i<n; i++)
dp[n] += recImp(dp, i)*recImp(dp, n-1-i);
return dp[n];
}
}
小结:
这道题的难点在于弄明白递归在干什么,如何利用之前的已经算出的节点和base case求出现在需要的结果。提示:根的结果=Sum(左子树结果*右子树结果)。