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 134
134
- [ day 39] ( ./day39.md )
135
135
- [ 62. 不同路径] ( ./day39/lc62.md )
136
136
- [ 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 )
137
142
- [ 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