枚举、递归和动态规划

枚举、递归和动态规划

ID:9070558

大小:106.00 KB

页数:7页

时间:2018-04-16

枚举、递归和动态规划_第1页
枚举、递归和动态规划_第2页
枚举、递归和动态规划_第3页
枚举、递归和动态规划_第4页
枚举、递归和动态规划_第5页
资源描述:

《枚举、递归和动态规划》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、枚举、递归和动态规划李文新北京大学信息科学技术学院利用计算机编写程序进行问题求解时,有两种不同于用数学方法解决问题的最常用的思想:枚举和递归。枚举的基本思想是在可能的解空间中逐一尝试,通过判定尝试的值是否与已知条件矛盾来确定其是否是问题的解。这种思想通常不需要知道输入条件与问题的解之间的函数关系。递归的基本思想是假设对于输入x,问题的解是f(x),则试图找到函数g,使得f(x)=g(f(x-1))。也就是找到一种将原问题缩小规模的方法,并且如果当规模缩小到一定程度时,问题的解是已知的。那么我们就可以通过函数的递归调用获得在不知道函数f的情况下获得问题的解。在递归调用过程中,有

2、时候可能会出现重复计算的现象,我们可以将递归的过程翻转过来考虑,从小规模问题的已知解推向要求解的较大规模问题的解,这个过程需要保留中间计算结果,我们称这种解决问题的方法是动态规划。在计算机上使用枚举和递归的思想解决问题是利用了计算机的高速度和不知疲惫的特性,它所求解的问题通常是不容易找或者找不到求解方程的问题。动态规划可以看作是进行时间效率优化的一种方法。例1.枚举-熄灯问题1222问题描述:有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会

3、被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。在下图1中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。与一盏灯毗邻的多个按钮被按下时,一个操作会抵消另一次操作的结果。在图2中,第2行第3、5列的按钮都被按下,因此第2行、第4列的灯的状态就不改变。根据上面的规则,我们知道:1)第2次按下同一个按钮时,将抵消第1次按下时所产生的结果。因此,每个按钮最多只需要按下一次。2)各个按钮被按下的顺序对最终的结果没有影响。3)对第1行中每盏点亮的灯,按下第2行对应的按钮,就可以熄灭

4、第1行的全部灯。如此重复下去,可以熄灭第1、2、3、4行的全部灯。同样,按下第1、2、3、4、5列的按钮,可以熄灭前5列的灯。图1图2对矩阵中的每盏灯设置一个初始状态。请你写一个程序,确定需要按下哪些按钮,恰好使得所有的灯都熄灭。输入:第一行是一个正整数N,表示需要解决的案例数。每个案例由5行组成,每一行包括6个数字。这些数字以空格隔开,可以是0或1。0表示灯的初始状态是熄灭的,1表示灯的初始状态是点亮的。输出:对每个案例,首先输出一行,输出字符串“PUZZLE#m”,其中m是该案例的序号。接着按照该案例的输入格式输出5行,其中的1表示需要把对应的按钮按下,0则表示不需要按对

5、应的按钮。每个数字以一个空格隔开。输入样例2011010100111001001100101011100001010101011001011101100010100输出样例PUZZLE#1101001110101001011100100010000PUZZLE#2100111110000000100110101101101例2.枚举-恼人的青蛙问题描述:在韩国,有一种小的青蛙。每到晚上,这种青蛙会跳越稻田,从而踩踏稻子。农民在早上看到被踩踏的稻子,希望找到造成最大损害的那只青蛙经过的路径。每只青蛙总是沿着一条直线跳越稻田,而且每次跳跃的距离都相同。稻田里的稻子组成一个栅格,每

6、棵稻子位于一个格点上,如图1所示。而青蛙总是从稻田的一侧跳进稻田,然后沿着某条直线穿越稻田,从另一侧跳出去,如图2所示。青蛙的每一跳都恰好踩在一棵水稻上,将这棵水稻拍倒。可能会有多只青蛙从稻田穿越,有些水稻被多只青蛙踩踏,如图3所示。当然,农民所见到的是图4中的情形;既看不到图3中的直线,也见不到别人家田里被踩踏的水稻。根据图4,农民能够构造出青蛙穿越稻田时的行走路径,并且只关心那些在穿越稻田时至少踩踏了3棵水稻的青蛙。因此,每条青蛙行走路径上至少包括3棵被踩踏的水稻。而在一条青蛙行走路径的直线上,也可能会有些被踩踏的水稻不属于该行走路径。在图4中,格点(2,1)、(6,1)

7、上的水稻可能是同一只青蛙踩踏的,但这条线上只有两棵被踩踏的水稻,因此不能作为一条青蛙行走路径;格点(2,3)、(3,4)、(6,6)在同一条直线上,但它们的间距不等,因此不能作为一条青蛙行走路径;格点(2,1)、(2,3)、(2,5)、(2,7)是一条青蛙行走路径,该路径不包括格点(2,6)。请你写一个程序,确定:在一条青蛙行走路径中,最多有多少颗水稻被踩踏。例如,图4的答案是7,因为第6行上全部水稻恰好构成一条青蛙行走路径。输入:从标准输入设备上读入数据。第一行上两个整数R、C,分别表示稻田中水稻的行

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。