动态规划杂谈

放弃思考选哪个offer的问题了,我们来扯扯动态规划。

本篇适合:做了很多动态规划题了,但是看到微软这次校招笔试的第二题 http://hihocoder.com/problemset/problem/1400 还是很懵逼的同学

其实直到今年5月,我都还是对动态规划比较懵逼和恐惧的。
刷过很多背包,刷过LIS、LCS……然而题目稍微复杂一点,秒炸。

果然鹅厂的实习生笔试题来了个 最长回文子序列 :
然后果然不会做。

之后问学弟,直接甩我一个回答:
这不是区间dp裸题吗?
dp[i][j]表示从i到j最长回文子序列的长度。
如果str[i]==str[j] , dp[i][j]=dp[i+1][j-1]+2
否则,dp[i][j]= max (dp[i+1][j] , dp[i][j-1])

这个题之后,突然开始开窍了……

==========================================
就我目前这个渣水平看来,动态规划的设计,其实不外乎3步:
1、确定基本状态方式
2、加状态以能在转移的时候不受牵制
3、打磨转移的细节。


第一步是个单选题,就是目前没见人系统整理过,有选项这一说。

你的转移过程,从小问题到大问题,你的最小问题要长什么样?
01背包?或者上面提到的微软的题?从前到后(从第1件,到最后一件)
(其实绝大多数动态规划起手先试试看从前到后作为基础状态,并没有大错)
最优矩阵乘法?从小区间,到大区间(也就是上面提到的区间dp)
在树上的问题,比如,树的最远2点,比如,works application的无线路由器?
以i为根的子树作为状态(树形dp)
要枚举子集?比如,小规模的旅行商问题?
以所有可能的子集作为状态(因为一般用二进制的01表示这个元素在不在子集中,进而把子集这个数学概念/对象,变成一些int范围内的数值,所以称作,状态压缩动态规划

等等等等。
(当然还有基础状态更加复杂的动态规划,但这些短期看不会在面试题中出现了,(而且我也不会了),按下不表)

==========================================
至于第二步

曾经有一次个人赛,题目我已经找不到了……
当时那是最后一个题,动态规划设计感觉黔驴技穷——设计了一种状态,但是根本没法转移,我还要考虑另一个参数——的时候,开始瞎翻手边的书。
突然看到一句话,豁然开朗:
当发现状态无法转移后,常见的方法是增加维度,即增加新的因素,更细致地描述状态。
(刘汝佳《算法竞赛入门经典(第二版)》)
或者用一些糙的话来讲这个道理:
- 诶呀,我做出这个选择,要看前面做过的选择的脸色?
- 你要考虑前面什么东西,就把那个东西加为状态
- 诶呀,这里有个数量/blabla的限制条件?
- 限制条件?转移过程中控制不能的, 加状态。

比如上面微软的那个题:
我从前往后考虑
当前这个字符要不要?要的话还得看前面一个字符???这直接按长度设置状态,不行啊
那直接加一维度,表示结束字符啊!这样你后面转移不就只要字符没事就选上,冲突就不作为转移来源了嘛~

works application这个题同理:
限制路由器个数?
加一维度状态,表示用了多少路由器。
我的转移要看孩子节点的情况(才能算对价值)?
加一维度,表示根节点状态,这样父亲节点按需拉走。

=======================================================

一句话,dp没有那么可怕
找基底,把牵制变状态,然后?面对面试差不多了,优化再按需考虑吧!

脑子有点乱,当我的胡诌吧,以上。
全部评论
说起来,如果觉得我值得把这个话题详细展开给你们讲解的,请留言顶起来。
点赞 回复 分享
发布于 2016-10-28 16:21
今天面银联,又是一个动态规划,没答出来。。。
点赞 回复 分享
发布于 2016-10-28 12:13
点赞 回复 分享
发布于 2016-10-28 17:26

相关推荐

2024-12-17 19:24
门头沟学院 Java
黑皮白袜臭脚体育生:看你后备隐藏能源多不多,最坏的情况就是每个星期的三天课程都不在周末,那么每个星期公司那边请一天半假,半天假请上午,上午正常上课,早点溜去请病假或者中午去请病假,然后坐高铁回公司,记得提前请学校那边实训课下午的病假,就说肚子痛,然后下午就公司上班,第二个实训周同样,但病假理由是牙齿痛,像肚子痛和牙齿痛这种校医院不方便查,会同意你出去检查的,很多时候都不需要你的检查报告,这里的问题就是最坏情况时距离过远的话可能要坐飞机才能赶上,然后请假的话不一定请了就有回应,可能要等老师,然后距离不远不近的情况到公司了也是迟到,得想个说辞掩盖一下,顺便晚上多加点班补下时间,特殊情况特殊处理,正常不建议加班常态化,这样每个星期可以多凑出来半天,老师面子也有了公司那边也不至于无法交差,就是有点费存粮,如果哪个星期的三天课有一天或两天在周末的话那就更好应对了。实习还是建议去,学校的课懂的都懂
点赞 评论 收藏
分享
2024-12-09 16:42
门头沟学院 Java
程序员牛肉:我愿称你这种简历为npc简历。特点就是毫无任何亮点。你简历没有任何问题,但就是太普通了。实在是太普通了。 你可以在牛客搜一搜有多少人的简历和你一摸一样。一个大一点的公司一天能收几百份简历,你要是有公司邮箱的话,你可以尝试一下。在这几百份简历中,面试官面试一个人就需要1个小时。一天最多面试5个人。 照这样算,一个部门抽出3个人来面试,一天面试15个人。10天也最多面试150个人。在如此悬殊的投递和面试比之下,面试官一天要翻大量的简历。你这种简历真的是毫无亮点,面试官真的很难激起面试你的欲望。 没有学历,没有好的项目,技术也一般。写简历真的是给人乱写的感觉。 第一个项目中,使用mybatis plus这个插件来和数据库进行交互也可以作为亮点吗?基于nacos实现一个微服务中的服务注册也算亮点?第二个项目还是黑马点评。像有这种项目的简历一抓一大把。 问题来了:你觉得面试官为什么会面试你?在简历大致相同的情况下,你学校又是个二本,你认为面试官选择你而不选择学历更高的同学的原因是什么? 所以我觉得对于你来讲,可以一边投递实习,一边准备新的项目。同时积极去探索一些自己能够写到简历上的亮点。比如是不是有自己的公众号或者博客。比如是不是有自己开源项目,比如是不是一些含金量比较高的比赛 想要有面试机会的第一步就是让自己从这种npc简历中跳出来,最起码有一点“活人”的气息
点赞 评论 收藏
分享
评论
7
70
分享

创作者周榜

更多
牛客网
牛客企业服务