[翻译]How to Find a Solution ( 如何找到问题的答案,来自Top Coder 网站)
原文链接: https://www.topcoder.com/community/data-science/data-science-tutorials/how-to-find-a-solution/
个人感觉,这篇文章很不错,从一个比较高的高度、相对系统的总结了一些经典算法问题的经典思路。翻译过来是为了方便自己理解和学习,也希望能够帮到有需要的朋友。
全文很长,我会一部分一部分的慢慢搬运。
- Dynamic Programming 动态规划问题
- 待续
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 网站)的更多相关文章
- WebForms VS. MVC(翻译)
(本文翻译自CodeProject上阿三写的一篇文章,原文地址:http://www.codeproject.com/Articles/528117/WebForms-vs-MVC,讲了有关ASP.A ...
- Excel里内嵌在线翻译
本来寻思着继续写点系统运行日志跟踪技术的,但早晨哥家领导从单位打来电话,让帮助她的闺蜜搞一个excel翻译的问题,总部IT搞不定.我过去是用excel做了几年工作,却都是些数学计算,跟翻译也扯不上啊: ...
- 爹地,我找到了!,15个极好的Linux find命令示例
爹地,我找到了!, 15个极好的Linux find命令示例 英文原文:Daddy, I found it!, 15 Awesome Linux Find Command Examples 标签: L ...
- poj 2503:Babelfish(字典树,经典题,字典翻译)
Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 30816 Accepted: 13283 Descr ...
- Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)
# 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) - 原文 <https://githu ...
- 《Django By Example》第十章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译本章过程中几次想放弃,但是既然 ...
- python:爬虫1——实战(下载一张图片、用Python模拟浏览器,通过在线的有道词典来对文本翻译)
一.下载一只猫 import urllib.request response = urllib.request.urlopen("http://cdn.duitang.com/uploads ...
- 'internalField' 和'boundaryField'的区别?【翻译】
翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam/84322-difference-between-internalfield ...
- 焦大翻译:提防一些seo错误认知(完整版)
http://www.wocaoseo.com/thread-179-1-1.html 多人在开始做seo的时候,都曾经尝试通过黑盒测试来找出哪些因素对排名有效果. 黑盒测试是我们IT行业常用术语,它 ...
随机推荐
- 程序设计C 实验三 题目九 方程式(0300)
Description: Consider equations having the following form: a*x1*x1 + b*x2*x2 + c*x3*x3 + d*x4*x4 = 0 ...
- iphone 拨打电话的 两种方法-备
大家想不想在自己的应用中拨打电话呀?打电话可以用openURL:这个API, 如:[[UIApplication sharedApplication] openURL:[NSURL URLWithSt ...
- Qt creator 常用的快捷健
Qt creator 常用的快捷健 F1 查看帮助F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果)Shift+F2 声明和定义之间切换F4 头文件 ...
- ServletConfig对象 【通过此对象获取到web.xml中的信息】
用途: 1)想让当前的Servlet读取一些在web.xml文件配置的初始化参数时, 可以使用ServletConfig对象,他是Servlet运 ...
- form 和 ngModel
参考 https://docs.angularjs.org/api/ng/type/ngModel.NgModelController https://docs.angularjs.org/api/n ...
- 局域网架个YUM源-HTTP的
在安装CDH时,这是个绕不过去的坎. 参考URL: http://www.21ops.com/linux/26465.html 奇怪的是,我并没执行creatrepo这个,直接将光盘MOUNT来用的. ...
- VC6.0 编译 gdlib 库
环境 WinXP, MSVC6.0 1 从 https://bitbucket.org/libgd/gd-libgd/downloads 下载最新版本 libgd 2 可以用 nmake 编译 w ...
- rpm -qs查看包信息
rpm -qs mysql-connector-c-devel Query options (with -q or --query): -c, --configfiles ...
- mv,Directory not empty不能目录覆盖
一.mv /test1/* /test2/test1rm -rf /test1 二. You can however use rsync with the --remove-source-files ...
- JAVA车票管理系统(简单GUI)
一. 需求分析 1.设计题目:车票管理系统 用JAVA语言和数据结构知识设计设计车票管理系统.要求如下所述: 一车站每天有n个发车班次,每个班次都有一个班次号(1.2.3…n),固定的发车时间, ...