Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
wwwanlingxiao
LeetCodeAnimation
Commits
1c20a183
Commit
1c20a183
authored
May 07, 2019
by
misterbooo
Browse files
浅谈什么是动态规划以及相关的「股票」算法题
parent
d2072127
Changes
3
Hide whitespace changes
Inline
Side-by-side
notes/LeetCode第121号问题:买卖股票的最佳时机.md
View file @
1c20a183
...
...
@@ -2,23 +2,27 @@
# 浅谈什么是动态规划以及相关的「股票」算法题
> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划
### 1 概念
**动态规划**
算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。
**阶段
:
**
对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**阶段**
:
对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**状态
:
**
状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**状态**
:
状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**决策
:
**
决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**决策**
:
决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**策略
:
**
由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**策略**
:
由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**最优策略
:
**
在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**最优策略**
:
在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**状态转移方程
:
**
状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
**状态转移方程**
:
状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
### 2 使用场景
...
...
@@ -134,7 +138,7 @@ class Solution {
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
**注意
:
**
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**
:
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**示例 1:**
...
...
@@ -286,7 +290,4 @@ class Solution {
###

\ No newline at end of file
notes/LeetCode第122号问题:买卖股票的最佳时机II.md
View file @
1c20a183
...
...
@@ -2,23 +2,27 @@
# 浅谈什么是动态规划以及相关的「股票」算法题
> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划
### 1 概念
**动态规划**
算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。
**阶段
:
**
对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**阶段**
:
对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**状态
:
**
状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**状态**
:
状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**决策
:
**
决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**决策**
:
决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**策略
:
**
由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**策略**
:
由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**最优策略
:
**
在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**最优策略**
:
在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**状态转移方程
:
**
状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
**状态转移方程**
:
状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
### 2 使用场景
...
...
@@ -97,14 +101,14 @@
所以我们只要考虑当天买和之前买哪个收益更高,当天卖和之前卖哪个收益更高。
*
buy = max(buy, -price[i]) (注意:根据定义 buy 是负数)
*
sell = max(sell, prices[i] + buy)
-
buy = max(buy, -price[i]) (注意:根据定义 buy 是负数)
-
sell = max(sell, prices[i] + buy)
#### 边界
第一天
`buy = -prices[0]`
,
`sell = 0`
,最后返回 sell 即可。
###代码实现
###
代码实现
```
java
class
Solution
{
...
...
@@ -134,7 +138,7 @@ class Solution {
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
**注意
:
**
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**
:
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**示例 1:**
...
...
@@ -257,11 +261,10 @@ class Solution {
#### 边界
*
一开始
`fstBuy = -prices[0]`
*
买入后直接卖出,
`fstSell = 0`
*
买入后再卖出再买入,
`secBuy - prices[0]`
*
买入后再卖出再买入再卖出,
`secSell = 0`
-
一开始
`fstBuy = -prices[0]`
-
买入后直接卖出,
`fstSell = 0`
-
买入后再卖出再买入,
`secBuy - prices[0]`
-
买入后再卖出再买入再卖出,
`secSell = 0`
最后返回 secSell 。
...
...
@@ -286,7 +289,7 @@ class Solution {
###

notes/LeetCode第123号问题:买卖股票的最佳时机III.md
View file @
1c20a183
...
...
@@ -2,23 +2,27 @@
# 浅谈什么是动态规划以及相关的「股票」算法题
> 本文首发于公众号「五分钟学算法」,是[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站:[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
## 动态规划
### 1 概念
**动态规划**
算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。在学习动态规划之前需要明确掌握几个重要概念。
**阶段
:
**
对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**阶段**
:
对于一个完整的问题过程,适当的切分为若干个相互联系的子问题,每次在求解一个子问题,则对应一个阶段,整个问题的求解转化为按照阶段次序去求解。
**状态
:
**
状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**状态**
:
状态表示每个阶段开始时所处的客观条件,即在求解子问题时的已知条件。状态描述了研究的问题过程中的状况。
**决策
:
**
决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**决策**
:
决策表示当求解过程处于某一阶段的某一状态时,可以根据当前条件作出不同的选择,从而确定下一个阶段的状态,这种选择称为决策。
**策略
:
**
由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**策略**
:
由所有阶段的决策组成的决策序列称为全过程策略,简称策略。
**最优策略
:
**
在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**最优策略**
:
在所有的策略中,找到代价最小,性能最优的策略,此策略称为最优策略。
**状态转移方程
:
**
状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
**状态转移方程**
:
状态转移方程是确定两个相邻阶段状态的演变过程,描述了状态之间是如何演变的。
### 2 使用场景
...
...
@@ -97,14 +101,14 @@
所以我们只要考虑当天买和之前买哪个收益更高,当天卖和之前卖哪个收益更高。
*
buy = max(buy, -price[i]) (注意:根据定义 buy 是负数)
*
sell = max(sell, prices[i] + buy)
-
buy = max(buy, -price[i]) (注意:根据定义 buy 是负数)
-
sell = max(sell, prices[i] + buy)
#### 边界
第一天
`buy = -prices[0]`
,
`sell = 0`
,最后返回 sell 即可。
###代码实现
###
代码实现
```
java
class
Solution
{
...
...
@@ -134,7 +138,7 @@ class Solution {
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
**注意
:
**
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**注意**
:
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
**示例 1:**
...
...
@@ -257,11 +261,10 @@ class Solution {
#### 边界
*
一开始
`fstBuy = -prices[0]`
*
买入后直接卖出,
`fstSell = 0`
*
买入后再卖出再买入,
`secBuy - prices[0]`
*
买入后再卖出再买入再卖出,
`secSell = 0`
-
一开始
`fstBuy = -prices[0]`
-
买入后直接卖出,
`fstSell = 0`
-
买入后再卖出再买入,
`secBuy - prices[0]`
-
买入后再卖出再买入再卖出,
`secSell = 0`
最后返回 secSell 。
...
...
@@ -286,7 +289,7 @@ class Solution {
###

Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment