学习DP过程中的一些和大牛、该大牛为acm冠军、也是交大acm历史上最牛的人,没有之一。
交流的心得:差不多就是我理解的一个阶梯过程,为保护隐私,去掉名字了:
石头 16:23:46
动态规划是不是一般就是填矩阵?
石头 16:23:54
感觉
大牛XXX 16:24:25
差不多吧
大牛XXX 16:24:28
填矩阵。。。。
大牛XXX 16:24:31
可以这么理解
石头 16:25:10
???从前面小范围的解 经过一系列比较复杂的数学推导 往大范围填
大牛XXX 16:25:19
嗯 差不多
大牛XXX 16:25:29
其实动态规划可以有很多种理解
石头 16:25:55
还有啥你说下 我扩展下思路
大牛XXX 16:25:58
我觉得本质就是把一个大问题转化为一个小一点的问题,然后小问题转化为一个更小的问题
大牛XXX 16:26:05
只到转化到了最小的那个问题
大牛XXX 16:26:14
而总的问题数目不是太多
大牛XXX 16:26:23
所以就转化转化着就转化完了
石头 16:26:34
总的问题数目不是太多?
石头 16:26:39
什么意思
大牛XXX 16:26:52
就是总的问题数是多项式级的
大牛XXX 16:26:59
比如n^2个总问题数,n^3个
大牛XXX 16:27:05
而不是n!,n^n之类的
大牛XXX 16:27:22
关键在于你怎么描述这个问题
石头 16:27:37
哦
大牛XXX 16:27:44
“用f[i,j]来表示节点i~j这些节点组成的一个最优二叉查找树”
这个就是一种描述
大牛XXX 16:27:54
这种描述总的问题数是n^2级别的
大牛XXX 16:28:05
“f[i, j] = min{f[i, k - 1] + f[k + 1, j] + sum[i, j]}”
这个就是问题的转化
大牛XXX 16:28:09
所以这样就能搞定
大牛XXX 16:28:27
你也可以换一种描述比如:“f[i]来表示节点1~i这些节点组成的一个最优二叉查找树
大牛XXX 16:28:38
这样描述问题数只有O(n)个
大牛XXX 16:28:41
貌似NB了不少
大牛XXX 16:28:45
但是这样描述你没法转化了
大牛XXX 16:29:26
当然也可以从另外一些角度入手,动态规划的理解可以有很多角度的
大牛XXX 16:29:44
我这只是从一个角度来给你分析和理解动态规划的思想
石头 16:29:46
还有啥
大牛XXX 16:30:02
还有比如
大牛XXX 16:30:21
你要理解动态规划实际上是一种记录以前已经求解过的问题避免再重复求的办法
石头 16:30:40
恩 记忆
石头 16:31:09
最简单的就是斐波拉契数列 如果用递归重复很多 记录连续2项就行
-------------------------------------------------------------------------------------------------------------------------------------------------
大牛XXX 16:31:21
这个是我以前写的高阶培训PPT,你理解了基础后可以大致看看,看看对你的理解有没有加强
石头 16:31:32
哦 好 石头 10:45:41
昨天说滴那个最优二叉查找树
石头 10:45:56
它的左右子树是不是也是最优二叉查找树
石头 10:46:01
?
大牛XXX 10:46:06
对
石头 10:46:19
就是说 是递归的 任意的左右子树都是最优二叉查找树
大牛XXX 10:46:23
你枚举一个root后,左右子树也必须是最优二叉查找树
大牛XXX 10:46:32
这就是所谓的最优子问题
大牛XXX 10:46:40
要原问题最优,子问题也必须是最优的
石头 10:47:09
那能不能用递归呢
石头 10:47:30
这样问题不是递归定义的吗
石头 10:47:52
如果不用动态规划的话
大牛XXX 10:48:21
可以用递归
大牛XXX 10:48:29
但是递归到某个问题的时候
大牛XXX 10:48:38
你也要用类似f[i,j]的数组把结果存下来
大牛XXX 10:48:47
下次再递归到这的时候判断下以前是不是递归过
大牛XXX 10:48:52
递归过的话就直接返回答案
大牛XXX 10:49:03
这样就和用动态规划的递推实现是一回事了
石头 11:16:16
状态转移方程很难写出来啊 我发现动态规划的难点就在于描述问题和写状态转移方程 前期分析比较复杂 算法的代码一般都很简单
石头 11:16:33
这周末好好学一下 先去吃饭了
石头 16:36:05
最右二叉查找树的root不一定是概率最大的点?
石头 16:36:11
优
大牛XXX 17:01:29
不一定
大牛XXX 22:08:07
搞定了?
石头 22:08:11
恩
大牛XXX 22:08:16
N B啊
大牛XXX 22:08:26
注释也很想尽
大牛XXX 22:08:32
这种水平
大牛XXX 22:08:39
绝对秒杀百度了
大牛XXX 22:08:49
建议去面GOOGLE
石头 22:08:51
写一行注释一行 要不然写道后面就不会
石头 22:09:00
操 别恶搞
大牛XXX 22:09:22
GOOGLE和微软的面试题貌似有面动态规划的。。。
石头 22:09:26
有没有简单的动态规划的资料 给我发一个 那个太难了
大牛XXX 22:09:31
腾讯的我也见过有面动态规划的
石头 22:09:34
先学点基础滴
大牛XXX 22:09:35
百度没见过面过
大牛XXX 22:09:40
可见百度的水平略微低点
大牛XXX 22:10:00
基础资料我这貌似没有
大牛XXX 22:10:05
你可以去网上搜搜
大牛XXX 22:10:34
可以去百度文库搜搜动态规划
大牛XXX 22:10:37
估计有些基础的PPT
石头 22:10:59
为什么有滴动态规划很简单 有的很复杂
石头 22:11:54
在这个例子之前 我看过传递闭包和floyd完全最短路径的 哦 还有二项式系数
石头 22:12:36
就很明显有一个关系 这个关系不明显 如果不看书 自己看不出来关系
大牛XXX 22:12:45
嗯
石头 22:13:03
传递闭包和floyd完全最短路径的 哦 还有二项式系数
基本上就是照着公式填矩阵就行了
大牛XXX 22:14:58
你已经很猛了
大牛XXX 22:15:08
全交大会动态规划的人,不超过20个
石头 22:15:13
别他妈恶搞
石头 22:17:34
动态规划是不是几种算法设计思想里面最难得一种 我觉得
大牛XXX 22:18:09
差不多
大牛XXX 22:18:23
深度优先搜索算法也容易搞晕
大牛XXX 22:18:31
我以前这块也搞得很晕
石头 22:18:37
???
石头 22:18:49
深度优先不就是上次我问滴那个吗
大牛XXX 22:18:54
图论算法里面有些很难的,不过那些算法谈不上思想了
大牛XXX 22:18:56
不是
大牛XXX 22:19:00
你那是遍历
大牛XXX 22:19:18
是有限图的遍历,每个节点只访问一次
大牛XXX 22:19:22
还有一种是搜索
大牛XXX 22:19:29
我给你出个最简单的题目
大牛XXX 22:19:31
你看你会做不
大牛XXX 22:19:34
输入一个N
大牛XXX 22:19:37
整数N
大牛XXX 22:19:47
要你输出所有可以组成N的加法的形式
大牛XXX 22:19:50
例如N=4
大牛XXX 22:19:53
你要输出:
大牛XXX 22:20:07
1+1+1+1
1+1+2
2+2
1+3
不考虑顺序,1+3和3+1是同一种
大牛XXX 22:20:22
这个你会不?
石头 22:21:04
弄课树吗
大牛XXX 22:21:21
你可以试着写写
石头 22:21:42
我要回了 一会再说
大牛XXX 22:53:29
那你可以投一投西安的IBM
大牛XXX 22:53:32
看看适合你不
石头 22:53:40
被鄙视了 去面试过
石头 22:54:09
找工作的时候再投吧
大牛XXX 22:54:17
也是
石头 22:54:23
我现在实力很弱
大牛XXX 22:54:24
我看你潜心研究算法
大牛XXX 22:54:28
连动态规划都搞懂了
大牛XXX 22:54:36
到时候找工作的时候面试应该随意秒杀了
石头 22:54:52
而且很多公司要求实习时间太长 我不想去那么久 那样没时间准备招工作
石头 22:55:11
只想找个一两个月的去玩玩就回来
石头 22:56:02
别恶搞了 公司招人不是光看算法 除非像你这样的达人 冲过去就说哥只面算法 别的都不懂 不要问别的问题
大牛XXX 22:56:22
面几个算法
大牛XXX 22:56:26
能写几个小程序的
大牛XXX 22:56:29
一般公司就收了
石头 22:56:32
一些实际的开发经验还是很重要滴
大牛XXX 22:56:47
实际开发经验很难判断
大牛XXX 22:56:55
有些人就是在简历上瞎喷的。。。
大牛XXX 22:57:00
他真做了多少也没人知道
石头 22:57:33
是啊 牛X点的公司还要问很多开发经验 当然我指的是一般路线走出来滴人 如果像你这种人 你可以直接叫他不要问你其他问题
石头 22:57:54
呵呵 瞎扯也要知道点东西才能扯啊
石头 22:58:09
问深入点的东西就扯不出来了
石头 22:58:20
细节什么的 别人一问就知道你不懂
大牛XXX 22:58:24
问题是他做的项目和那面试官不对口
大牛XXX 22:58:31
所以他随便瞎扯,面试官以为很NB。。。
石头 22:58:47
哈哈 到时候那我也把简历扯牛逼点
大牛XXX 22:58:49
然后面试官就只能随便问几个算法题了
大牛XXX 22:59:02
你要是项目不是你做的
大牛XXX 22:59:07
但是你把那项目都看过一遍
大牛XXX 22:59:11
代码啊设计什么很熟悉
大牛XXX 22:59:21
其实基本上就可以说成完全是你做的了
大牛XXX 22:59:37
我这有两个项目,代码都不是我写的,但是我很熟悉代码和设计
大牛XXX 22:59:43
以后我跳槽我就肯定说成是我做的。。。
石头 23:01:19
数据结构我觉得一些基础的书上的讲滴我现在都很熟了 不过实际问题还是要分析
石头 23:01:36
可能需要进行一些训练才能熟练
大牛XXX 23:02:19
嗯
大牛XXX 23:02:26
面试官一般喜欢问些实际问题
大牛XXX 23:02:31
看看你会不会运用
石头 23:02:46
是啊 运用需要训练
石头 23:03:05
到时候再看看一些面试题什么滴
大牛XXX 23:03:40
而且代码一定要熟练
大牛XXX 23:03:44
一些小算法题的
大牛XXX 23:03:53
经常面试的时候人家要你直接在纸上写的
大牛XXX 23:04:01
写得一定要精炼
大牛XXX 23:04:04
不要乱七八糟的
-------------------------------------------------------------------------------------------------------------------------------------------------
石头 9:39:33
dijkstra最短路径是不是也是动态规划的思想 每次加入一个顶点 从小范围往大范围扩展
石头 9:42:48
我错了 贪婪?
石头 9:43:09
怎么感觉也像动态规划
石头 9:56:25
dijkstra怎么这么像prim
石头 11:22:17
对于图里面的很多算法 你一般怎么去表示2个顶点之间的的距离无穷大 用-1还是弄一个很大的数(大于已知会出现的距离范围) 用-1的话每次比较在代码里要判断是不是负数 显得不好看 用大数貌似又不是很专业的样子 大牛XXX 11:23:49
大牛XXX 11:23:52
一般用大数,用-1很容易出错
石头 12:02:54
哦哦 好
大牛XXX 19:46:42
下午去辅导一个实习生了
大牛XXX 19:46:44
蛋疼了一下午
大牛XXX 19:46:49
你还有什么问题没?
石头 19:51:21
你现在带小弟了?
大牛XXX 19:52:09
因为我要闪了
大牛XXX 19:52:15
所以要我去辅导个小弟
大牛XXX 19:52:17
然后闪人
石头 19:52:51
那小弟梦不萌
石头 19:52:53
猛
大牛XXX 19:53:53
太弱
大牛XXX 19:53:57
不然也不会这么费力
大牛XXX 19:54:05
连数据库是啥都不知道
大牛XXX 19:54:10
select语句不太会
石头 19:54:12
哪个学校的
大牛XXX 19:54:16
没法交流了
大牛XXX 19:54:20
北邮的
石头 19:54:23
靠 那怎么去滴
石头 19:54:30
算法很猛?
大牛XXX 19:54:36
不知道
石头 19:54:52
数据库是啥都不知道
太夸张吧
大牛XXX 19:54:55
linux下操作也不会
石头 19:54:58
大一的啊
大牛XXX 19:55:03
他说他没学过数据库课
大牛XXX 19:55:07
研二的
石头 16:51:12
附件为我们质量保证部资深总监(原百度质量部总监)kevin给我们新人培训所作的精品教程ppt,请参考。
石头 16:51:24
你们百度的怎么跑阿里巴巴去了
大牛XXX 16:56:05
不知道
------------------------------------------------------------------------------------------------------------------------------------------------
石头 20:47:54
大哥 在不在
大牛XXX 20:48:01
zai
石头 20:48:57
动态规划里面填矩阵有的是沿行 有的是沿列 有的是沿着对角线 这个跟什么有关?
石头 20:49:18
C(i,j)的递推式吗
大牛XXX 20:49:24
看依赖
大牛XXX 20:49:36
你看确定一个c(i,j)
大牛XXX 20:49:57
它依赖于其它的哪些 (i1, j1),(i2,j2)....
大牛XXX 20:50:07
如果这些依赖点都在上面
大牛XXX 20:50:15
你就沿行填
大牛XXX 20:50:18
都在左边
大牛XXX 20:50:25
你就沿列填
大牛XXX 20:50:52
如果依赖很不确定
大牛XXX 20:50:56
你估计要建个图
大牛XXX 20:51:01
拓扑排序下了
石头 20:51:03
就是说那个递推的表达式?它表明了这个动态规划生成的过程? 如果有一个动态的图 实际上可以看出来,它是怎么一个个生成的?是不是这个意思
大牛XXX 20:51:19
实际是按任意一个拓扑排序序列的顺序来填
石头 20:51:46
也就是说在那个点还没有出来之前,你的递推表达式C(i,j)肯定就用不到那个点
大牛XXX 20:51:59
对
石头 20:52:01
恩 是这个意思 就是拓扑
大牛XXX 20:52:16
所以说
石头 20:52:23
递推表达式本身蕴含了每个C(i,j)出来的顺序
大牛XXX 20:52:43
一切动态规划都可转化为一个有向无环图的最短路径问题
石头 20:52:55
石头 20:53:04
这么牛逼 怎么转化
石头 20:53:23
你说了我就知道是那个意思了 跟拓扑排序联系上了
大牛XXX 20:53:48
随意了
大牛XXX 20:53:51
我看你也理解了
大牛XXX 20:54:01
你现在是高手
大牛XXX 20:54:08
看样子面试中可以随意秒杀了
石头 20:54:47
有些习题说可不可以优化下空间复杂度 也跟这个表达式有关吧 ?
石头 20:55:54
?
大牛XXX 20:56:06
可能吧
大牛XXX 20:56:10
你要怎么优化?
大牛XXX 20:56:18
优化空间有许多办法,不知道你指的哪种
石头 20:57:04
朴素的动态规划就是开个矩阵 根据C(i,j)填矩阵 有时候可以只开个数组
石头 20:57:12
有时候 不是所有的
大牛XXX 20:57:21
嗯
大牛XXX 20:57:28
比如你按行填矩阵的
大牛XXX 20:57:43
填第i行的时候,最多只要往回去查i-1行的结果
大牛XXX 20:57:54
那前面i-2行的空间就都可以释放了
石头 20:58:21
从右往左填?
石头 20:59:24
实际上就是根据那个递推式的特征 开一个数组的话 产生C(i,j)的顺序就跟矩阵不一样,在那个数还没有出来之前,你不能把它要用到的数覆盖掉(要保持这个准则)
大牛XXX 20:59:40
嗯
大牛XXX 20:59:44
就这个意思
大牛XXX 20:59:55
最经典的嘛
大牛XXX 21:00:00
f[i] = f[i - 1] + f[i - 2]
大牛XXX 21:00:06
斐波那契数列
大牛XXX 21:00:17
实际上用3个变量就行了
大牛XXX 21:00:20
不需要一个数组
石头 21:02:05
我画了半天的矩阵才悟出来啊! 空间优化的方法其实和填矩阵的顺序都是由表达式的属性决定的 跟动态规划产生的过程有关 ,这个要在纸上划一下才能观察出来
石头 21:02:59
你科研吧 晚上接着闹!
--------------------------------------------------------------------------------------------------------------------------------------------------
石头 15:13:46
n个矩阵连乘顺序的种数是不是(n-1)*(n-2)*...*1 = (n-1)!
石头 15:16:35
哦 错了
石头 15:16:41
怎么推 你知道不
石头 15:58:57
莫非也是卡特兰数 递推式的构造思想和最有二叉树的形式很像 最优二叉查找树是C
石头 16:00:09
最优二叉查找树C{i,j}从中间分开找一个root出来,矩阵连乘也是从 C{i,j}中间找一个分开点出来
石头 16:00:19
????
大牛XXX 16:11:03
HI
大牛XXX 16:11:05
在不?
大牛XXX 16:11:08
我刚有事去了
石头 16:11:11
在啊
石头 16:11:30
多少种
石头 16:11:37
怎么求的
大牛XXX 16:12:17
什么东西?
大牛XXX 16:12:21
你把问题再发一遍
石头 16:13:16
n个矩阵连乘顺序的种数是不是(n-1)*(n-2)*...*1 = (n-1)!
我开始这样问 想错了 应该比这个小 有重复
石头 16:13:50
后来我想了下 说莫非也是卡特兰数 递推式的构造思想和最有二叉树的形式很像 最优二叉查找树是C{i,j}从中间分开找一个root出来,矩阵连乘也是从 C{i,j}中间找一个分开点出来
大牛XXX 16:14:08
是的
大牛XXX 16:14:19
n矩阵连乘是卡特兰数问题
石头 16:14:59
阶乘那个想的太简单了 abcd 只想到每次并一个 数目就少一个 但是并的有重复 有前后顺序是一样的情况
大牛XXX 16:15:05
n个元素的二叉查找树数目
大牛XXX 16:15:09
也是卡特兰数问题
大牛XXX 16:15:28
还有很多都是卡特兰
大牛XXX 16:15:35
去看看组合数学书
大牛XXX 16:15:41
还有个排队买票问题
大牛XXX 16:15:51
也就是从0,0走到(n,n)
石头 16:16:01
对 这个很显然啊
大牛XXX 16:16:02
不能穿越对角线之类的走法方案数
大牛XXX 16:16:04
等等
大牛XXX 16:16:06
都是卡特兰
石头 16:16:31
从0,0走到(n,n)
这个太明显了 但是其他的不明显啊 怎么证明
大牛XXX 16:16:55
去网上搜吧
大牛XXX 16:17:00
我学了很久了
大牛XXX 16:17:04
已经快忘了
石头 16:17:11
噢 好吧
石头 16:17:47
原来这么多东西都是相通的啊
石头 16:20:02
出栈次序问题
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
石头 16:20:14
百度 卡特兰数的介绍
大牛XXX 16:20:53
嗯 是的
大牛XXX 16:20:59
这些我都知道
大牛XXX 16:21:07
不知道有没有我没见过的
石头 16:21:20
凸多边形的三角剖分问题
求将一个凸多边形区域分成三角形区域的方法数。
大牛XXX 16:21:26
这些问题一般教材里没讲也会出现在教材后的练习题里的
石头 16:21:36
就举了这几个
石头 16:21:55
看来卡特兰数很牛逼啊 很多问题都跟这有关
--------------------------------------------------------------------------------------------------------------------------------------------------
大牛XXX 21:24:22
HI
大牛XXX 21:24:23
在不?
大牛XXX 21:24:30
你ping下115.181.48.131
大牛XXX 21:24:32
看能通不
石头 21:46:23
能
石头 21:46:38
刚才不在
石头 21:46:43
可以通
大牛XXX 21:17:58
你可以去试面下创新工厂的实习生
大牛XXX 21:18:09
这家公司里的项目都还不错,而且面试难度不大
石头 21:18:21
不来西安招人
大牛XXX 21:18:33
我女朋友在台湾电话面了3次就拿到实习OFFER了,基本上也没问题什么问题
石头 21:18:46
哦
石头 21:18:50
在哪投
大牛XXX 21:18:52
问些什么10进制转2进制
大牛XXX 21:18:55
迷宫问题什么的。。。
大牛XXX 21:18:58
真弱智
石头 21:19:16
好 我看看
大牛XXX 21:19:59
我带的那个实习生太烦人了
大牛XXX 21:20:07
tmd进展实在太缓慢
大牛XXX 21:20:42
主要给他说了什么第2天就忘了,每次又要重新说
石头 21:22:21
他的强项是什么
石头 21:22:25
技术还是算法
大牛XXX 21:22:26
没强项
大牛XXX 21:22:28
今天还问了下
大牛XXX 21:22:33
果真是通信专业的
石头 21:22:39
???
大牛XXX 21:22:41
难怪tm数据库都没听说过
---------------------------------------------------------------------------------------------------------------------------------------------------
总结:
实际是按任意一个拓扑排序序列的顺序来填
一切动态规划都可转化为一个有向无环图的最短路径问题
把大的问题转化成小的问题(这些小问题是交叠的),而总的问题数目不是太多,其实一个状态就是一个子问题,状态转移方程指出了这些子问题的解之间的关系。
这就叫做professional~
理解的深度就是不一样
以前在bbs上见过他在dp的讨论中说过这样的观点,当时没学,不懂。现在才知道dp原来还跟拓扑排序联系上了!!!!
一定要多和牛人交流,无论是在技术上,还是做事,看待事物和世界的观点上,都会有广阔的不同的视角。