原题地址:点我传送
一开始完全不知道从何下手,想用动态规划也找不到地方。找了资料发现可以这样想:对一个序列1~n,每个点可以做根节点,接下来分成两边就是子问题的求解。那么用ans[i]表示n=i时的解,则显然ans[i]是由1~i的每个点做根节点的两部分的解之积的和。不难有代码。
C++:
class Solution {
public:
int numTrees(int n) {
int* ans = new int [n + 1];
ans[0] = 1;
ans[1] = 1;
for(int i = 2; i <= n; i++)
{
ans[i] = 0;
for(int j = 0; j <= i; j++)
{
ans[i] += ans[j-1]*ans[i-j];
}
}
return ans[n];
}
};