思考過程:
1.能不能遞歸求出所有的二叉搜索樹呢?
2.相鄰的答案之間有沒有規律呢?
3.找不到規律,但找出了每一個答案下的所有結果
4.看題解,才明白。。
下次做DP題目也這麼思考,先看遞歸否,再找怎麼由之前的答案推出現在的答案來。
- ans[n]爲所求答案,也就是節點數爲n時,有多少二叉搜索樹。
- f(i)是以i爲根節點的二叉搜索樹的個數,左子樹有i-1個元素,右子樹有n-i個元素。
- 所以f(i)=ans[i-1]*ans[n-i],左子樹有ans[i-1]個可能,所以要相乘。
class Solution {
public int numTrees(int n) {
int[] ans=new int[n+1];
ans[0]=ans[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
ans[i]+=ans[j-1]*ans[i-j];
}
}
return ans[n];
}
}