ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:268.91KB ,
资源ID:16445803      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16445803.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(动态规划详细教程Word文档格式.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

动态规划详细教程Word文档格式.docx

1、= 0 or c 20 or b 20 or c 20, then w(a, b, c) returns: w(20, 20, 20) b and b c, then w(a, b, c) returns: w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) otherwise it returns: w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)这本身就是一个递归函数,要是按照函数本身写递归式,结果肯定是TLE,这里我开了一个三维数组,从w(0,0,0)开始递推,逐步产生

2、到w(20,20,20)的值,复杂度O(n3).总结:这道题是很地道的DP,因为它的子问题实在是太多了,所以将问题的结果保存起来,刘汝佳算法艺术和信息学竞赛中115页讲到自底向上的递推,这个例子就非常典型。总体来说这个题目还是非常简单的,不过这个思想是地道的动态规划。Pku acm 2081 Recamans Sequence 动态规划题目总结(三)一道很简单的动态规划,根据一个递推公式求一个序列,我选择顺序的求解,即自底向上的递推,一个int数组result根据前面的值依此求出序列的每一个结果,另外一个boolean数组flagi记录i是否已经出现在序列中,求result的时候用得着,这样就

3、避免了查找。核心的java代码为:for(i=1;i0&flagresulti-1-i=false) resulti = resulti-1-i; flagresulti-1-i = true; else resulti = resulti-1+i; flagresulti-1+i = true;Pku acm 1953 World Cup Noise 动态规划题目总结(四)给定一个小于45的整数n,求n位2进制数中不含相邻1的数的个数。看似简单的一道题,如果当n=45时,对2的45次方检查,是无法完成的任务。先分析一下这个问题:N以1结尾的个数以0结尾的个数总和123对于n=1来说,以1结尾

4、、以0结尾个数都是1,总和是2,下面过度到2:对于所有以1结尾的数,后面都可以加上0,变为n=2时以0结尾的,而只有结尾为0的数才能加上1(因为不能有两个连续0),这样就可以在n=2的格里分别填上1、2,总和算出来为3,以此类推,我们可以算出所有nresultij-1?resulti-1j:resultij-1;System.out.println(resultlength1length2);Pku acm 2250 Compromise 动态规划题目总结(六)这个也是求最长公共字串,只是相比Common Subsequence需要记录最长公共字串的构成,此时箭头的标记就用上了,在程序中,用o

5、pt存放标记,0表示朝向左上方,1表示指向上,-1表示指向左。result存放当前最大字串长度。在求最优解时,顺着箭头从后向前寻找公共字串的序号,记录下来,输出即可。该算法在算法导论中有详细的讲解。Pku acm 1159 Palindrome 动态规划题目总结(七)给一个字符串,求这个字符串最少增加几个字符能变成回文,如Ab3bd可以增加2个字符变为回文:Adb3bdA。通过这样的结论可以和最长公共子串联系起来(未证明):S和S (注:S是S的反串)的最长公共子串其实一定是回文的。这样我们就可以借助lcs来解决该题,即用s的长度减去lcs的值即可。核心的Java代码为:total-LCS(s

6、tring,new StringBuffer(string).reverse().toString();/函数LCS返回两个string的lcs的长度Pku acm 1080 Humman Gene Function 动态规划题目总结(八)这是一道比较经典的DP,两串基因序列包含A、C、G、T,每两个字母间的匹配都会产生一个相似值,求基因序列(字符串)匹配的最大值。这题有点像求最长公共子序列。只不过把求最大长度改成了求最大的匹配值。用二维数组optij记录字符串a中的前i个字符与字符串b中的前j个字符匹配所产生的最大值。假如已知AG和GT的最大匹配值,AGT和GT的最大匹配值,AG和GTT的最

7、大匹配值,求AGT和GTT的最大匹配值,这个值是AG和GT的最大匹配值加上T 和T的匹配值,AGT和GT的最大匹配值加上T 和-的匹配值,AG和GTT的最大匹配值加上-和T的匹配值中的最大值,所以状态转移方程:optij = max(opti-1j-1+table(bi-1,aj-1),optij-1+table(-,aj-1),opti-1j+table(,bi-1);NullAGT-3-5-6-8-11-12-14-2-4-7-9第0行,第0列表示null和字符串匹配情况,结果是-和各个字符的累加: for(i=1;=num1; opt0i = opt0i-1+table(,ai-1);

8、for(i=1;=num2; opti0 = opti-10+table(,bi-1);optnum2num1即为所求结果。Pku acm 2192 Zipper 动态规划题目总结(九)这个题目要求判断2个字符串能否组成1个字符串,例如cat和tree能组成tcraete。我们定义一个布尔类型的二维数组 array,arrayij表示str1i和str2j能否组成stri+j.i=0或者j=0表示空字符串,所以初始化时,array0j表示str1的前j个字符是否和str都匹配。对于str=tcraete:tre可以证明:当arrayi-1j( arrayij上面一格)和arrayij-1( a

9、rrayij左面一格)都为0时,arrayij为0.当arrayi-1j( arrayij上面一格)为1且左面字母为stri+j时或者当arrayij-1( arrayij左面一格)为1且上面字母为stri+j时,arrayij为1.这就是状态转移方程为。核心的Java代码:if(arrayij-1&str1.charAt(j-1)=str.charAt(i+j-1)|arrayi-1j&str2.charAt(i-1)=str.charAt(i+j-1) arrayij = true;else arrayij = false;Pku acm 3356 AGTC 动态规划题目总结(十)一个字符

10、串可以插入、删除、改变到另一个字符串,求改变的最小步骤。和最长公共子序列类似,用二维数组optij记录字符串a中的前i个字符到字符串b中的前j个字符匹配所需要的最小步数。假如已知AG到GT的最小步数,AGT到GT的最小步数,AG到GTT的最小步数,求AGT到GTT的最小步数,此时T= =T,这个值是AG到GT的最小步数,AGT到GT的最小步数加一(AGT到GT的最小步数等于AGTT到GTT的最小步数,加一是将T删除的一步),AG到GTT的最小步数加一(AG到GTT的最小步数等于AGT到GTTT的最小步数,加一是在AGT上增加T的一步)。假如已知AG到GT的最小步数,AGA到GT的最小步数,AG

11、到GTT的最小步数,求AGA到GTT的最小步数,此时A! =T,这个值是AG到GT的最小步数加一(A改变为T),AGA到GT的最小步数加一(AGA到GT的最小步数等于AGAT到GTT的最小步数,加一是将T删除的一步),AG到GTT的最小步数加一(AG到GTT的最小步数等于AGA到GTTA的最小步数,加一是在GTTA上删除A的一步)。所以状态转移方程:if(str1.charAt(i-1)=str2.charAt(j-1) arrayij = Math.min(Math.min(arrayi-1j-1, arrayi-1j+1), arrayij-1+1); arrayij = Math.min

12、(Math.min(arrayi-1j-1+1, arrayi-1j+1), arrayij-1+1);初始化的时候和最长公共子序列不同,因为第0行,第0列表示null转化到字符串情况,结果是字符串的长度:=m; arrayi0 = i; =n; array0i = i;7结果是arraymnPku acm 1887 Testing the CATCHER 动态规划题目总结(十一)题目叙述很繁琐,其实就是求最长下降子序列,这一类题也是动态规划的典型题。这类问题有两种算法,一种 T(o) = O(n2),另一种T(o) = O(nlogn),这里用第一种,在1631 Bridging signa

13、ls的解题报告中介绍第二种。创建一个一维数组num_arrayj,max_array,num_arrayj表示序列的元素,max_arrayi表示以第i个元素结尾的序列中的最长下降子序列,初始化为1,对于一个max_arrayi,遍历前面的每个元素j,如果num_arrayj num_arrayi且max_arrayj= max_arrayi,那么max_arrayj就要加1,所以递推公式为:if(num_arrayi=num_arrayj&max_arrayi=max_arrayj) max_arrayi+;最后选最大的一个max_arrayi就是最长下降子序列的个数。Java关键部分的代码

14、:length;i; if(num_arrayimax_value)?max_arrayi:max_value;max_value是最后的结果。Pku acm 2533 Longest Ordered Subsequence 动态规划题目总结(十二)这个题目和1887 Testing the CATCHER一模一样,没有什么值得说的,关键的c代码如下:for(j=1;j+) if(maxinumj) maxi+; if(maxiresult) result=maxi;printf(%dn,result);Pku acm 1631 Bridging signals 动态规划题目总结(十三)这个题

15、目可以转化为最长上升子序列,这样这个题目似乎就和2533 Longest Ordered Subsequence 1887 Testing the CATCHER一样了,迅速写下代码,结果超时!看来只能用O(nlogn)的算法了。在O(n2)的算法中:创建一个一维数组arrayj,opt,arrayj表示序列的元素,opti表示以第i个元素结尾的序列中的最长下降子序列,初始化为1,对于一个opti,遍历前面的每个元素j,如果arrayjarrayi且optj=opti,那么optj就要加1,在这里,遍历前面的每个元素j,寻找此前最大的子序列时间复杂度为O(n),如果我们在一个有序的序列中查找此

16、前最大的序列长度,我们就可以用二分查找,时间复杂度就会降为O(logn),总的时间复杂度就会为O(nlogn)。为此,我们增加一个一维数组B,Bi表示当前序列为i的末尾元素的最小值。 例如对于序列:4 2 6 3 1 5 :iarrayoptB构建过程如下:i=1时,opti=1 Bi=4(当前为1的序列的末尾元素的最小值)i=2时,2不大于4,所以opti=1,将B1更新为2i=3时,6大于2,所以opti=1+1,将B2更新为6i=4时,3在2 6之间,所以opti=1+1,将B2更新为3i=5时,1小于2,所以opti=1,将B1更新为1i=6时,5大于3,所以opti=2+1,将B3更新为5opt6就是最后的结果。从构建的过程可以容易的证明一下两点:B是递增的。B是当前序列为i的末尾元素的最小值。以上“2不大于4”,“3在2 6之间”等等的判断采用二分查找,所以总的时间复杂度为:O(nlogn),核心的c代码如下: num = arrayi; left = 1; right = Blen; while(left=right) mid = (left+right)/2; if(Bmidnum) left = mid+1; right = mid-1; opti =

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1