auto commit

This commit is contained in:
CyC2018
2019-11-02 12:07:41 +08:00
parent 182e1440a4
commit bb6e0df82d
784 changed files with 7545 additions and 2827 deletions

View File

@ -40,6 +40,8 @@
<!-- GFM-TOC -->
递归和动态规划都是将原问题拆成多个子问题然后求解他们之间最本质的区别是动态规划保存了子问题的解避免重复计算
# 斐波那契数列
@ -430,9 +432,9 @@ public int numDecodings(String s) {
# 最长递增子序列
已知一个序列 {S<sub>1</sub>, S<sub>2</sub>,...,S<sub>n</sub>}取出若干数组成新的序列 {S<sub>i1</sub>, S<sub>i2</sub>,..., S<sub>im</sub>}其中 i1i2 ... im 保持递增即新序列中各个数仍然保持原数列中的先后顺序称新序列为原序列的一个 **子序列**
已知一个序列 {S<sub>1</sub>, S<sub>2</sub>,...,S<sub>n</sub>}取出若干数组成新的序列 {S<sub>i1</sub>, S<sub>i2</sub>,..., S<sub>im</sub>}其中 i1i2 ... im 保持递增即新序列中各个数仍然保持原数列中的先后顺序称新序列为原序列的一个 **子序列**
如果在子序列中当下标 ix > iy S<sub>ix</sub> > S<sub>iy</sub>称子序列为原序列的一个 **递增子序列**
如果在子序列中当下标 ix > iy S<sub>ix</sub> > S<sub>iy</sub>称子序列为原序列的一个 **递增子序列**
定义一个数组 dp 存储最长递增子序列的长度dp[n] 表示以 S<sub>n</sub> 结尾的序列的最长递增子序列长度对于一个递增子序列 {S<sub>i1</sub>, S<sub>i2</sub>,...,S<sub>im</sub>}如果 im < n 并且 S<sub>im</sub> < S<sub>n</sub>此时 {S<sub>i1</sub>, S<sub>i2</sub>,..., S<sub>im</sub>, S<sub>n</sub>} 为一个递增子序列递增子序列的长度增加 1满足上述条件的递增子序列中长度最长的那个递增子序列就是要找的在长度最长的递增子序列上加上 S<sub>n</sub> 就构成了以 S<sub>n</sub> 为结尾的最长递增子序列因此 dp[n] = max{ dp[i]+1 | S<sub>i</sub> < S<sub>n</sub> && i < n}
@ -676,7 +678,7 @@ public int knapsack(int W, int N, int[] weights, int[] values) {
}
```
**空间优化**
**空间优化**
在程序实现时可以对 0-1 背包做优化。观察状态转移方程可以知道,前 i 件物品的状态仅与前 i-1 件物品的状态有关,因此可以将 dp 定义为一维数组,其中 dp[j] 既可以表示 dp[i-1][j] 也可以表示 dp[i][j]。此时,
@ -701,7 +703,7 @@ public int knapsack(int W, int N, int[] weights, int[] values) {
}
```
**无法使用贪心算法的解释**
**无法使用贪心算法的解释**
0-1 背包问题无法使用贪心算法来求解也就是说不能按照先添加性价比最高的物品来达到最优这是因为这种方式可能造成背包空间的浪费从而无法达到最优考虑下面的物品和一个容量为 5 的背包如果先添加物品 0 再添加物品 1那么只能存放的价值为 16浪费了大小为 2 的空间最优的方式是存放物品 1 和物品 2价值为 22.
@ -711,7 +713,7 @@ public int knapsack(int W, int N, int[] weights, int[] values) {
| 1 | 2 | 10 | 5 |
| 2 | 3 | 12 | 4 |
**变种**
**变种**
- 完全背包物品数量为无限个