Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
rrrrutdk
Fucking Algorithm
提交
6294fbcb
F
Fucking Algorithm
项目概览
rrrrutdk
/
Fucking Algorithm
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Fucking Algorithm
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6294fbcb
编写于
11月 12, 2020
作者:
L
labuladong
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fixurl
上级
36f59b6f
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
12 addition
and
12 deletion
+12
-12
动态规划系列/动态规划之博弈问题.md
动态规划系列/动态规划之博弈问题.md
+1
-1
动态规划系列/动态规划设计:最长递增子序列.md
动态规划系列/动态规划设计:最长递增子序列.md
+5
-5
动态规划系列/团灭股票问题.md
动态规划系列/团灭股票问题.md
+2
-2
动态规划系列/最优子结构.md
动态规划系列/最优子结构.md
+1
-1
动态规划系列/高楼扔鸡蛋问题.md
动态规划系列/高楼扔鸡蛋问题.md
+1
-1
算法思维系列/滑动窗口技巧.md
算法思维系列/滑动窗口技巧.md
+2
-2
未找到文件。
动态规划系列/动态规划之博弈问题.md
浏览文件 @
6294fbcb
...
...
@@ -22,7 +22,7 @@
上一篇文章
[
几道智力题
](
https://labuladong.gitbook.io/algo
)
中讨论到一个有趣的「石头游戏」,通过题目的限制条件,这个游戏是先手必胜的。但是智力题终究是智力题,真正的算法问题肯定不会是投机取巧能搞定的。所以,本文就借石头游戏来讲讲「假设两个人都足够聪明,最后谁会获胜」这一类问题该如何用动态规划算法解决。
博弈类问题的套路都差不多,下文
举例
讲解,其核心思路是在二维 dp 的基础上使用元组分别存储两个人的博弈结果。掌握了这个技巧以后,别人再问你什么俩海盗分宝石,俩人拿硬币的问题,你就告诉别人:我懒得想,直接给你写个算法算一下得了。
博弈类问题的套路都差不多,下文
参考
[
这个 YouTube 视频
](
https://www.youtube.com/watch?v=WxpIHvsu1RI
)
的思路
讲解,其核心思路是在二维 dp 的基础上使用元组分别存储两个人的博弈结果。掌握了这个技巧以后,别人再问你什么俩海盗分宝石,俩人拿硬币的问题,你就告诉别人:我懒得想,直接给你写个算法算一下得了。
我们「石头游戏」改的更具有一般性:
...
...
动态规划系列/动态规划设计:最长递增子序列.md
浏览文件 @
6294fbcb
...
...
@@ -10,8 +10,8 @@
![](
../pictures/souyisou.png
)
相关推荐:
*
[
动态规划设计:最大子数组
](
../动态规划系列/最大子数组.md
)
*
[
一文学会递归解题
](
../投稿/一文学会递归解题.md
)
*
[
动态规划设计:最大子数组
](
https://labuladong.gitbook.io/algo
)
*
[
一文学会递归解题
](
https://labuladong.gitbook.io/algo
)
读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目:
...
...
@@ -19,7 +19,7 @@
**-----------**
也许有读者看了前文
[
动态规划详解
](
../动态规划系列/动态规划详解进阶.md
)
,学会了动态规划的套路:找到了问题的「状态」,明确了
`dp`
数组/函数的含义,定义了 base case;但是不知道如何确定「选择」,也就是不到状态转移的关系,依然写不出动态规划解法,怎么办?
也许有读者看了前文
[
动态规划详解
](
https://labuladong.gitbook.io/algo
)
,学会了动态规划的套路:找到了问题的「状态」,明确了
`dp`
数组/函数的含义,定义了 base case;但是不知道如何确定「选择」,也就是不到状态转移的关系,依然写不出动态规划解法,怎么办?
不要担心,动态规划的难点本来就在于寻找正确的状态转移方程,本文就借助经典的「最长递增子序列问题」来讲一讲设计动态规划的通用技巧:
**数学归纳思想**
。
...
...
@@ -43,7 +43,7 @@
**我们的定义是这样的:`dp[i]` 表示以 `nums[i]` 这个数结尾的最长递增子序列的长度。**
PS:为什么这样定义呢?这是解决子序列问题的一个套路,后文
[
动态规划之子序列问题解题模板
](
../动态规划系列/子序列问题模板.md
)
总结了几种常见套路。你读完本章所有的动态规划问题,就会发现
`dp`
数组的定义方法也就那几种。
PS:为什么这样定义呢?这是解决子序列问题的一个套路,后文
[
动态规划之子序列问题解题模板
](
https://labuladong.gitbook.io/algo
)
总结了几种常见套路。你读完本章所有的动态规划问题,就会发现
`dp`
数组的定义方法也就那几种。
根据这个定义,我们就可以推出 base case:
`dp[i]`
初始值为 1,因为以
`nums[i]`
结尾的最长递增子序列起码要包含它自己。
...
...
@@ -164,7 +164,7 @@ public int lengthOfLIS(int[] nums) {
我们只要把处理扑克牌的过程编程写出来即可。每次处理一张扑克牌不是要找一个合适的牌堆顶来放吗,牌堆顶的牌不是
**有序**
吗,这就能用到二分查找了:用二分查找来搜索当前牌应放置的位置。
PS:旧文
[
二分查找算法详解
](
../算法思维系列/二分查找详解.md
)
详细介绍了二分查找的细节及变体,这里就完美应用上了,如果没读过强烈建议阅读。
PS:旧文
[
二分查找算法详解
](
https://labuladong.gitbook.io/algo
)
详细介绍了二分查找的细节及变体,这里就完美应用上了,如果没读过强烈建议阅读。
```
java
public
int
lengthOfLIS
(
int
[]
nums
)
{
...
...
动态规划系列/团灭股票问题.md
浏览文件 @
6294fbcb
...
...
@@ -16,7 +16,7 @@
读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目:
[
买卖股票的最佳时机
](
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
/solution/
)
[
买卖股票的最佳时机
](
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
)
[
买卖股票的最佳时机 II
](
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/
)
...
...
@@ -32,7 +32,7 @@
很多读者抱怨 LeetCode 的股票系列问题奇技淫巧太多,如果面试真的遇到这类问题,基本不会想到那些巧妙的办法,怎么办?
**所以本文拒绝奇技淫巧,而是稳扎稳打,只用一种通用方法解决所用问题,以不变应万变**
。
这篇文章用状态机的技巧来解决,可以全部提交通过。不要觉得这个名词高大上,文学词汇而已,实际上就是 DP table,看一眼就明白了。
这篇文章
参考
[
英文版高赞题解
](
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/discuss/108870/Most-consistent-ways-of-dealing-with-the-series-of-stock-problems
)
的思路,
用状态机的技巧来解决,可以全部提交通过。不要觉得这个名词高大上,文学词汇而已,实际上就是 DP table,看一眼就明白了。
先随便抽出一道题,看看别人的解法:
...
...
动态规划系列/最优子结构.md
浏览文件 @
6294fbcb
...
...
@@ -54,7 +54,7 @@ return result;
当然,上面这个例子太简单了,不过请读者回顾一下,我们做动态规划问题,是不是一直在求各种最值,本质跟我们举的例子没啥区别,无非需要处理一下重叠子问题。
前文不
[
同定义不同解法
](
../动态规划系列/动态规划之四键键盘.md
)
和
[
高楼扔鸡蛋进阶
](
../动态规划系列/高楼扔鸡蛋问题.md
)
就展示了如何改造问题,不同的最优子结构,可能导致不同的解法和效率。
前文不
[
同定义不同解法
](
https://labuladong.gitbook.io/algo
)
和
[
高楼扔鸡蛋进阶
](
https://labuladong.gitbook.io/algo
)
就展示了如何改造问题,不同的最优子结构,可能导致不同的解法和效率。
再举个常见但也十分简单的例子,求一棵二叉树的最大值,不难吧(简单起见,假设节点中的值都是非负数):
...
...
动态规划系列/高楼扔鸡蛋问题.md
浏览文件 @
6294fbcb
...
...
@@ -243,7 +243,7 @@ def superEggDrop(self, K: int, N: int) -> int:
return
dp
(
K
,
N
)
```
这里就不展开其他解法了,留在下一篇文章
[
高楼扔鸡蛋进阶
](
../动态规划系列/高楼扔鸡蛋进阶.md
)
这里就不展开其他解法了,留在下一篇文章
[
高楼扔鸡蛋进阶
](
https://labuladong.gitbook.io/algo
)
我觉得吧,我们这种解法就够了:找状态,做选择,足够清晰易懂,可流程化,可举一反三。掌握这套框架学有余力的话,再去考虑那些奇技淫巧也不迟。
...
...
算法思维系列/滑动窗口技巧.md
浏览文件 @
6294fbcb
...
...
@@ -12,8 +12,8 @@
**最新消息:关注公众号参与活动,有机会成为 [70k star 算法仓库](https://github.com/labuladong/fucking-algorithm) 的贡献者,机不可失时不再来**
!
相关推荐:
*
[
东哥吃葡萄时竟然吃出一道算法题!
](
../高频面试系列/吃葡萄.md
)
*
[
如何寻找缺失的元素
](
../高频面试系列/消失的元素.md
)
*
[
东哥吃葡萄时竟然吃出一道算法题!
](
https://labuladong.gitbook.io/algo
)
*
[
如何寻找缺失的元素
](
https://labuladong.gitbook.io/algo
)
读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录