原文链接: https://www.topcoder.com/community/data-science/data-science-tutorials/how-to-find-a-solution/

个人感觉,这篇文章很不错,从一个比较高的高度、相对系统的总结了一些经典算法问题的经典思路。翻译过来是为了方便自己理解和学习,也希望能够帮到有需要的朋友。

全文很长,我会一部分一部分的慢慢搬运。

  1. Dynamic Programming 动态规划问题
  2. 待续

Dynamic Programming (动态规划)

相当多的问题是用这种算法技巧解决的,因此掌握如何识别这类问题就显得很有价值。但是,这要求我们具有相当的、动态规划方面的编程经验。

通常,动态规划问题会有几个主要的整数变量(比如 N)。这些变量通常是既不太小,也不太大。之所以会这样,是因为通常动态规划问题的复杂度是N^2,或者N^3,既不太大,也不太小的N就会比较合适。值得注意的是,如果N很小,(对于Top Coder上的问题,N很小是指N小雨30),那么很多可能这个问题就不是一个动态规划的问题。

除了这点,动态规划问题中一班都存在一些状态(states)和相应的一些规则(rule)。通过这些规则,一个规模较小的的状态可以到达一个规模大一些的状态。而且,较大的状态应该是仅依赖于较小规模的状态。那么,什么是所谓的状态(state)呢? 状态其实就是一些特定的情形或者状况。如果想进一步了解、掌握动态规划问题,可以阅读这篇文章

下面,我们来一起分析一道经典的动态规划问题。

给你N枚硬币,和他们的币值(v1,v2,..vN)。再告诉你一个总和S。请算出能够组合出总和S的最少硬币个数。(对于任意一种币值的硬币,你可以使用任意多枚)。如果不存在任何一种组合能够是的总和为S, 返回”不可能“。假定 N <= 100 并且 S <= 1000。

来自问题的提示信息:

* 问题给出了两个主要的整数变量(S和N),并且两者都是大小合适。(即,N * S 是在一个可以解决的时间复杂度范围内)。

* 状态(state)可以被这样定义: 为了能够组合出总和为某一数值、所需要的最少硬币个数。

* 较大状态 state i,仅仅依赖于较小一些的状态 state j ( j < i) 。这里的 i, j 分别代表一个需要组合出来的总和。state i 即表示要凑出总和为 i 所需要的最少硬币个数。

* 如果向某个特定状态添加一枚硬币,就可以获得一个更大的总和,也就是从一个较小的状态到达了一个更大一些的的状态。

如此分析,这个题目具备了所有动态规划的基本要素。下面,我们再来看一道稍微难一些的动态规划问题。

ZigZag - 2003 TCCC Semifinals 3:

一个数字序列叫做ZigZag序列(锯齿序列,如果序列中连续两个数字的差所组成的新序列是严格的正负数字交替出现。第一个差值(如果存在)可以是正数也可以是负数。任意长度小于2的序列都被认为是锯齿序列。给你一组数,找出其中是锯齿序列的最长子序列。(子序列是指从原序列中删除掉0个或更多个元素,对于剩下的元素仍然保持在原序列中相对顺序的序列)。假设给出的序列长度在50以内。

来自题目中的提示信息:

* 给出了N个数字 (N在50以内,不大不小)。

* 状态 state(i, d) 可以这样来定义:以序列中第 i 个数字为结尾的最长锯齿子序列的长度,并且如果子序列中倒数第二个数小于最后一个数,d = 0, 反之,d = 1。

* 状态 state i ,仅仅依赖于 state j (j < i)

* 向子序列的末尾再添加一个数字,就可以到达一个更大的状态。

以上,我们可以看出,这道题也具备动态规划问题的所有基本要素。

对于动态规划问题,最难的部分就是找出或者定义出状态(state),一旦完成了这一步,剩下的工作就是组织问题的答案了,而这个部分超出了本文想要讨论的范围,此处不予赘述。

[翻译]How to Find a Solution ( 如何找到问题的答案,来自Top Coder 网站)的更多相关文章

  1. WebForms VS. MVC(翻译)

    (本文翻译自CodeProject上阿三写的一篇文章,原文地址:http://www.codeproject.com/Articles/528117/WebForms-vs-MVC,讲了有关ASP.A ...

  2. Excel里内嵌在线翻译

    本来寻思着继续写点系统运行日志跟踪技术的,但早晨哥家领导从单位打来电话,让帮助她的闺蜜搞一个excel翻译的问题,总部IT搞不定.我过去是用excel做了几年工作,却都是些数学计算,跟翻译也扯不上啊: ...

  3. 爹地,我找到了!,15个极好的Linux find命令示例

    爹地,我找到了!, 15个极好的Linux find命令示例 英文原文:Daddy, I found it!, 15 Awesome Linux Find Command Examples 标签: L ...

  4. poj 2503:Babelfish(字典树,经典题,字典翻译)

    Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 30816   Accepted: 13283 Descr ...

  5. Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)

    # 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) - 原文 <https://githu ...

  6. 《Django By Example》第十章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译本章过程中几次想放弃,但是既然 ...

  7. python:爬虫1——实战(下载一张图片、用Python模拟浏览器,通过在线的有道词典来对文本翻译)

    一.下载一只猫 import urllib.request response = urllib.request.urlopen("http://cdn.duitang.com/uploads ...

  8. 'internalField' 和'boundaryField'的区别?【翻译】

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam/84322-difference-between-internalfield ...

  9. 焦大翻译:提防一些seo错误认知(完整版)

    http://www.wocaoseo.com/thread-179-1-1.html 多人在开始做seo的时候,都曾经尝试通过黑盒测试来找出哪些因素对排名有效果. 黑盒测试是我们IT行业常用术语,它 ...

随机推荐

  1. MySQL 使用索引扫描来做排序

    MySQL有两种方式可以生成有序的结果:通过排序操作:或者按照索引顺序扫描:如果EXPLAIN 出来的结果的type列的值为“index”,则说明MySQL使用了索引扫描来做排序(不要和Extra列的 ...

  2. C#编码标准--编码习惯

    C#编码标准--编码习惯 0.  书写程序时的大小写规则: a) 类:PascalCase表示法.如 MyClass b) 枚举值:PascalCase表示法.如 Colors.Red c) 枚举类型 ...

  3. linux 下使用crontab+wget实现秒及定时任务

    输入命令 crontab -e 打开一个文件,默认的编辑器为vi. 输入vi编辑器,输入i为插入,输入w保存,q退出,!强制.wq!强制保存并退出. * * * * * /usr/bin/wget - ...

  4. Swift学习之常用UI的使用

    Swift学习之常用UI的使用 最近笔者在开始学习苹果最新的编程语言,因为笔者认为,苹果既然出了这门语言就绝对不会放弃,除非苹果倒闭了(当然这里知识一个玩笑). 所以在不久的将来,swift绝对是iO ...

  5. Activity生命周期的学习以及Logcat的使用

    http://android.blog.51cto.com/268543/322518/  Activities是由Activity stack管理的.当一个新的Activity被启动,它就会处于st ...

  6. c语言结构体3之结构体嵌套

    注意: 1结构体内部再次定义一个结构体 但是没有创建结构体的实例  也就是说再次定义的结构体内部的变量会被当做母结构体的成员变量 struct tianchao { int data; ]; stru ...

  7. MyBatis3整合Spring3、SpringMVC3

    开发环境: System:Windows WebBrowser:IE6+.Firefox3+ JavaEE Server:tomcat5.0.2.8.tomcat6 IDE:eclipse.MyEcl ...

  8. Android HOME纽带,BACK主要采集和响应

    1.onUserLeaveHint 相比Home键(HOME)而近期应用的关键(APP_SWITCH)治,回车键很简单.复onKeyDown可以实现,如以下: @Override public boo ...

  9. Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...

  10. C/C++笔试准备(2)

    问题:编辑距离,是指将一个字符串变为另一个字符串,仅可以3种操作:修改一个字符,删除一个字符,插入一个字符.the变成that:删除e,插入a,插入t.20’ 实现编辑距离算法. 解算:利用动态规划的 ...