这两天只写了一道题,主要原因是因为对于题目理解有误采用了极端复杂的递推公式,不过采用carl哥的方法很清楚的定位到了问题,总之自我感觉很有收获。
这里重新引用carl哥的文章中的讲解:
对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!
1. 确定dp数组(dp table)以及下标的含义
2. 确定递推公式
3. dp数组如何初始化
4. 确定遍历顺序
5. 举例推导dp数组
题目:不同的二叉搜索树
题目链接:https://leetcode.cn/problems/unique-binary-search-trees/
代码:
public int numTrees(int n) {
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i < n + 1; i++)
for(int j = 1; j < i + 1; j++)
dp[i] += dp[j-1] * dp[i-j];
return dp[n];
}