这个星期还是在讲dp算法,所以继续水一水dp相关的题目吧!第一题是非常非常简单的,因为题目长得比较像树型dp,但其实还是简单的dp经典题目。
题目
Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?
For example,
Given n = 3, there are a total of 5 unique BST’s.
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
思路
让dp[i]表示当前最大数字为i的数组构成的BST的数量,那么dp[i]可以表示为遍历所有j小于i的情况以j为树根的子BST之和。
代码
class Solution {
public:
int numTrees(int n) {
//动态规划基本思想 用数组存储查找过的状态 然后递归
vector<int> dp(n + 1, 0); //表示最大数为i时能表示的BST数量
dp[0] = 1; //0为空 表示一种情况
for(int i = 1; i < dp.size(); i++) {
for(int j = 1; j <= i; j++) {
dp[i] += dp[j-1]*dp[i-j];
}
}
return dp[n];
}
};