diff --git a/KN6[01N)I2@QL]F9}U1A8JW.png b/KN6[01N)I2@QL]F9}U1A8JW.png new file mode 100644 index 0000000000000000000000000000000000000000..afa4c43b83976f98894684728186dd13ee5bf831 Binary files /dev/null and b/KN6[01N)I2@QL]F9}U1A8JW.png differ diff --git a/alg.md b/alg.md deleted file mode 100644 index 610d2b8d3fe3d9ebd48aebfad97ba6b4becbca9c..0000000000000000000000000000000000000000 --- a/alg.md +++ /dev/null @@ -1,60 +0,0 @@ - - -# 解题报告:不同的二叉搜索树 - -## 题目描述 - -```markdown -给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。 -``` - -## 思路分析 -​ 因为二叉搜索树的定义是左子树的节点值都小于根节点的值,右子树的节点值都大于根节点的值,所以对于任意的一个根节点,它的组成方式就是左子树的组成方式乘以右子树的组成方式。因为左子树和右子树的组成方式不影响对方的形态,所以问题可以使用动态规划来解决。 - -​ 设f(n)为n个节点的可构造二叉搜索树的数量。当n=0或n=1时,f(n)为1。当n>1时,根据上述分析可得出转移方程f(n)=\sum_{i=1}^{i=n} f(i-1)\times f(n-i),其中i为根节点的值,取值范围为[1, n]。最终结果为f(n)。 - -## 代码实现 - -```python -def numTrees(self, n: int) -> int: - # 定义一个数组存储二叉搜索树的数量 - dp = [0] * (n+1) - # 初始化,空树也算一种二叉搜索树 - dp[0] = 1 - dp[1] = 1 - # 遍历节点数从2到n的所有情况 - for i in range(2, n+1): - # 遍历以j为根节点的所有情况 - for j in range(1, i+1): - # 左子树的节点数 - left = j - 1 - # 右子树的节点数 - right = i - j - # 乘法原理,左子树和右子树的数量相乘 - dp[i] += dp[left] * dp[right] - return dp[n] -``` - -## 测试示例 - -​ 下面是一个测试代码的例子: - -gen.py: - -```py -import random -# 生成随机整数序列 -def data(n): - return [random.randint(1, 19) for _ in range(n)] -``` -test.py: - -```python -import gen -import alg -arr = gen.data(1) -n = arr[0] -print(n) -a = alg.numTrees(n) -print(a) -``` diff --git a/alg.py b/alg.py deleted file mode 100644 index e0251b4ca01b58bbc32dece3fd8df72aaae53504..0000000000000000000000000000000000000000 --- a/alg.py +++ /dev/null @@ -1,17 +0,0 @@ -def numTrees(n: int): - # 定义一个数组存储二叉搜索树的数量 - dp = [0] * (n+1) - # 初始化,空树也算一种二叉搜索树 - dp[0] = 1 - dp[1] = 1 - # 遍历节点数从2到n的所有情况 - for i in range(2, n+1): - # 遍历以j为根节点的所有情况 - for j in range(1, i+1): - # 左子树的节点数 - left = j - 1 - # 右子树的节点数 - right = i - j - # 乘法原理,左子树和右子树的数量相乘 - dp[i] += dp[left] * dp[right] - return dp[n] diff --git a/dp.cpp b/dp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..49fabe21677760d20a60b6d4f4d5379bcf5bb966 --- /dev/null +++ b/dp.cpp @@ -0,0 +1,34 @@ +#include +#include +using namespace std; + +#define maxn 10010 +int dp[maxn];////dp[i]A[i]Ϊβе + +void maxSubArray(vector& num) +{ + dp[0] = num[0]; + int ans[] = { 0 }; + for (int i = 1; i < num.size(); i++)//״̬תƷ + { + dp[i] = max(num[i], dp[i - 1] + num[i]); + } + //к + int k = dp[0]; + for (int i = 1; i < num.size(); i++) + { + if (dp[i] > k) + k = dp[i]; + } + cout << "the maxsubsum=" << k << endl; +} +int main() +{ + vector arr = { -2,1,-3,4,-1,2,1,-5,4 }; + for (int i = 1; i < arr.size(); i++) + { + cout << arr[i]<<" "; + } + cout << endl; + maxSubArray(arr); +} \ No newline at end of file diff --git a/gen.py b/gen.py deleted file mode 100644 index 74c9aff9d50b2c3bf222e7da760b1f4055fbc9d9..0000000000000000000000000000000000000000 --- a/gen.py +++ /dev/null @@ -1,4 +0,0 @@ -import random -# 生成随机整数序列 -def data(n): - return [random.randint(1, 19) for _ in range(n)] diff --git a/test.py b/test.py deleted file mode 100644 index 76bd13df9a6a78272b66da00fd01d41c31c88693..0000000000000000000000000000000000000000 --- a/test.py +++ /dev/null @@ -1,7 +0,0 @@ -import gen -import alg -arr = gen.data(1) -n = arr[0] -print(n) -a = alg.numTrees(n) -print(a) diff --git "a/\345\261\217\345\271\225\346\210\252\345\233\276 2023-04-25 203806.png" "b/\345\261\217\345\271\225\346\210\252\345\233\276 2023-04-25 203806.png" deleted file mode 100644 index 5535647eeebd1e43c4a935443371f26309888698..0000000000000000000000000000000000000000 Binary files "a/\345\261\217\345\271\225\346\210\252\345\233\276 2023-04-25 203806.png" and /dev/null differ diff --git "a/\347\256\227\346\263\225\350\256\276\350\256\241\345\210\206\346\236\220s=\345\256\236\351\252\214\344\270\211.md" "b/\347\256\227\346\263\225\350\256\276\350\256\241\345\210\206\346\236\220s=\345\256\236\351\252\214\344\270\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..7407a2d4ccb62b44111da4f590a331fb4b34f604 --- /dev/null +++ "b/\347\256\227\346\263\225\350\256\276\350\256\241\345\210\206\346\236\220s=\345\256\236\351\252\214\344\270\211.md" @@ -0,0 +1,82 @@ +# 算法设计分析 + +### 求最大子序列和 + +###### 1.算法实现及测试 + +```c++ +#include +#include +using namespace std; + +#define maxn 10010 +int dp[maxn];////dp[i]存放以A[i]为结尾的连续序列的最大和 + +void maxSubArray(vector& num) +{ + dp[0] = num[0]; + int ans[] = { 0 }; + for (int i = 1; i < num.size(); i++)//状态转移方程 + { + dp[i] = max(num[i], dp[i - 1] + num[i]); + } + //求最大连续子序列和 + int k = dp[0]; + for (int i = 1; i < num.size(); i++) + { + if (dp[i] > k) + k = dp[i]; + } + cout << "the maxsubsum=" << k << endl; +} +int main() +{ + vector arr = { -2,1,-3,4,-1,2,1,-5,4 }; + for (int i = 1; i < arr.size(); i++) + { + cout << arr[i]<<" "; + } + cout << endl; + maxSubArray(arr); +} +``` + +*思路*: + + 步骤 1:令状态 dp[i] 表示以 A[i] 作为末尾的连续序列的最大和(这里是说 A[i] 必须作为连续序列的末尾)。 + +步骤 2:做如下考虑:因为 dp[i] 要求是必须以 A[i] 结尾的连续序列,那么只有两种情况:(1)这个最大和的连续序列只有一个元素,即以 A[i] 开始,以 A[i] 结尾。(2) 这个最大和的连续序列有多个元素,即从前面某处 A[p] 开始 (p