DP练习
Rodge0
冲!
展开
-
96. 不同的二叉搜索树
class Solution { public: // 设G(n) 表示从[1,n]所有的二叉搜索树个数,F(i,n)表示i为根节点,从[1,n]有多少个二叉搜索树 // G(n) = sum(F(i,n)) i∈[1,n] // 由于[1,n]是不重复的数字,所有左右子树不存在重复的可能性 // 所以F(i,n) = G(i-1)·G(n-i) 组左右子树集合的笛卡尔积 // 那么,可以推导出,G(n)依赖于G(0)...G(n-1),所以只需要从小到大计算G函数即可 int numTr...原创 2020-08-24 20:13:05 · 122 阅读 · 0 评论 -
面试题 17.16. 按摩师
class Solution { public: int massage0(vector<int>& nums) { if(nums.empty()) return 0; vector<int> res(nums.size(), 0); if(nums.size() >= 1) res[0]=nums[0]; if(nums.size() >= 2) res[1]=max(nums[0], .原创 2020-08-22 11:08:11 · 138 阅读 · 0 评论 -
面试题 08.01. 三步问题
class Solution { public: int waysToStep0(int n) { if(n < 0) return -1; if(n == 0) return 0; if(n == 1) return 1; if(n == 2) return 2; vector<int> dp(n+1, 0); dp[1] = 1; dp[2] = 2; .原创 2020-08-21 23:56:37 · 112 阅读 · 0 评论 -
746. 使用最小花费爬楼梯
class Solution { public: int minCostClimbingStairs(vector<int>& cost) { // f(i) 表示到达i台阶在往上爬的花费 // 同一位置上一层或者上两层的花费实一样的 // 楼层的顶部在数组之外 // f(i) = min( f(i-1), f(i-2) ) + cost[i] vector<int> f(cost.si.原创 2020-08-21 23:42:34 · 90 阅读 · 0 评论 -
1025. 除数博弈
class Solution { public: bool divisorGame0(int N) { return N%2 == 0; } // f(i)表示先手输赢,如果能找到j能被i整除且f(i-j)是false则f(i)是能赢的,否则是输 bool divisorGame(int N) { vector<bool> f(N+1, 0); f[1]=0; f[2]=1; fo.原创 2020-08-21 22:43:03 · 84 阅读 · 0 评论 -
70. 爬楼梯
class Solution { public: /* int table[10000]; int climbStairs(int n) { if (n == 0 || n == 1) return 1; else if (0 != table[n]) return table[n]; else { int num = 0; if (0 != table[n - 1]) num += table.原创 2020-08-21 22:16:26 · 88 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
class Solution { public: int maxSubArray0(vector<int>& nums) { if(nums.size() == 0) return 0; int sum = 0x80000000; int cur = 0; // 滑动窗口 for(int i = 0; i <nums.size(); i++){ if(cur < .原创 2020-08-21 21:24:07 · 136 阅读 · 0 评论