File tree Expand file tree Collapse file tree 6 files changed +119
-0
lines changed Expand file tree Collapse file tree 6 files changed +119
-0
lines changed Original file line number Diff line number Diff line change 134134- [ day 39] ( ./day39.md )
135135 - [ 62. 不同路径] ( ./day39/lc62.md )
136136 - [ 63. 不同路径 II] ( ./day39/lc63.md )
137+ - [ day 41] ( ./day41.md )
138+ - [ 343. 整数拆分] ( ./day41/lc343.md )
139+ - [ 96.不同的二叉搜索树] ( ./day41/lc96.md )
140+ - [ day 42] ( ./day42.md )
141+ - [ 416. 分割等和子集] ( ./day42/lc416.md )
137142- [ remains] ( ./remains.md )
Original file line number Diff line number Diff line change 1+ # 第九章 动态规划part03
2+
3+ ● 343. 整数拆分
4+ ● 96.不同的二叉搜索树
5+
6+ 详细布置
7+
8+ 今天两题都挺有难度,建议大家思考一下没思路,直接看题解,第一次做,硬想很难想出来。
9+ ## 343. 整数拆分
10+
11+ https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html
12+ 视频讲解:https://www.bilibili.com/video/BV1Mg411q7YJ
13+ ## 96.不同的二叉搜索树
14+
15+ https://programmercarl.com/0096.%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
16+ 视屏讲解:https://www.bilibili.com/video/BV1eK411o7QA
Original file line number Diff line number Diff line change 1+ # 343. 整数拆分
2+
3+ ``` cpp
4+ class Solution {
5+ public:
6+ int integerBreak(int n) {
7+ // dp[ i] -> 对于正整数i 将其拆分为k个数之和的乘机最大值
8+ vector<int > dp(n+1);
9+ dp[ 0] =0;
10+ dp[ 1] =1;
11+ dp[ 2] =1;
12+ for (int i = 3; i <= n; i ++ ) {
13+ for (int j = 1; j <= i - j; j ++) {
14+ dp[ i] = max(dp[ i] , j * max(i-j,dp[ i-j] ));
15+ }
16+ }
17+ return dp[ n] ;
18+ }
19+ };
20+ ```
Original file line number Diff line number Diff line change 1+ # 96.不同的二叉搜索树
2+
3+ 想了一下,不会做
4+
5+ ``` cpp
6+ class Solution {
7+ public:
8+ int numTrees(int n) {
9+ vector<int > dp(n+1,0);
10+ if (n<=2)return n;
11+ if (n==3)return 5;
12+ // dp[ i] -> 恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种
13+ dp[ 0] = 1;
14+ dp[ 1] = 1;
15+ dp[ 2] = 2;
16+ dp[ 3] = 5;
17+ for ( int i = 4; i <= n; i ++ )
18+ for ( int j = 0; j < i; j ++ )
19+ dp[ i] += dp[ j] * dp[ i-j-1] ;
20+ return dp[ n] ;
21+ }
22+ };
23+ ```
24+
25+ 居然是要看形状,有点在猜一个公式的感觉
Original file line number Diff line number Diff line change 1+ # 第九章 动态规划part04
2+
3+ ● 01背包问题,你该了解这些!
4+ ● 01背包问题,你该了解这些! 滚动数组
5+ ● 416. 分割等和子集
6+
7+ 正式开始背包问题,背包问题还是挺难的,虽然大家可能看了很多背包问题模板代码,感觉挺简单,但基本理解的都不够深入。
8+
9+ 如果是直接从来没听过背包问题,可以先看文字讲解慢慢了解 这是干什么的。
10+
11+ 如果做过背包类问题,可以先看视频,很多内容,是自己平时没有考虑到位的。
12+
13+ 背包问题,力扣上没有原题,大家先了解理论,今天就安排一道具体题目。
14+
15+ 详细布置
16+ ## 01背包问题 二维
17+ https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html
18+ 视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6
19+ ## 01背包问题 一维
20+ https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-2.html
21+ 视频讲解:https://www.bilibili.com/video/BV1BU4y177kY
22+ ## 416. 分割等和子集
23+ 本题是 01背包的应用类题目
24+ https://programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html
25+ 视频讲解:https://www.bilibili.com/video/BV1rt4y1N7jE
26+
Original file line number Diff line number Diff line change 1+ # 416. 分割等和子集
2+
3+ 第一眼不会
4+
5+ ``` cpp
6+ class Solution {
7+ public:
8+ bool canPartition(vector<int >& nums) {
9+ // dp[ i] 容量为s//2的01背包
10+ int sum = 0;
11+ for (int i = 0; i < nums.size(); i ++ ) {
12+ sum += nums[ i] ;
13+ }
14+ if (sum & 1) return false;
15+ int target = sum >> 1;
16+ vector<int > dp (1+target);
17+ for (int i = 0; i < nums.size(); i ++ ) {
18+ for (int j = target; j >= nums[ i] ; j -- ) {
19+ dp[ j] = max(dp[ j] ,dp[ j-nums[ i]] +nums[ i] );
20+ }
21+ }
22+ return dp[ target] == target;
23+ }
24+ };
25+ ```
26+
27+ 一下子想不出转换成01背包的想法
You can’t perform that action at this time.
0 commit comments