acm动态规划方案总结.docVIP

  • 4
  • 0
  • 约1.88万字
  • 约 34页
  • 2020-12-30 发布于江苏
  • 举报
Pku acm 1163 the Triangle 动态计划题目总结(一) 题目: 对于一个有数字组成二叉树,求由叶子到根一条路径,使数字和最大,如: 7 8 8 1 0 2 7 4 4 4 5 2 6 5 这个是经典动态计划,也是最最基础、最最简单动态计划,经典多段图。思绪就是建立一个数组,由下向上动态计划,保留页子节点到目前节点最大值,Java关键代码以下: for(int i=num-2;i=0;i--){ for(int j=0;j=i;j++){ //该句是整个动态计划关键 number[i][j]=Math.max(number[i+1][j],number[i+1][j+1])+number[i][j]; } } 带有具体注释代码能够在 取得 Pku acm 1579 Function Run Fun 动态计划题目总结(二) Consider a three-parameter recursive function w(a, b, c): if a = 0 or b = 0 or c = 0, then w(a, b, c) returns: 1 if a 20 or b 20 or c 20, then w(a, b, c) returns: w(20, 20, 20) if a 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)开始递推,逐步产生到w(20,20,20)值,复杂度O(n^3). 总结:这道题是很地道DP,因为它子问题实在是太多了,所以将问题结果保留起来,刘汝佳《算法艺术和信息学竞赛》中115页讲到自底向上递推,这个例子就很经典。总体来说这个题目还是很简单,不过这个思想是地道动态计划。 带有具体注释代码能够在 取得 Pku acm 2081 Recamans Sequence 动态计划题目总结(三) 一道很简单动态计划,依据一个递推公式求一个序列,我选择次序求解,即自底向上递推,一个int数组result依据前面值依此求出序列每一个结果,另外一个boolean数组flag[i]统计i是否已经出现在序列中,求result时候用得着,这么就避免了查找。关键java代码为: for(i=1;i=500000;i++) { if(result[i-1]-i0flag[result[i-1]-i]==false) { result[i] = result[i-1]-i; flag[result[i-1]-i] = true; } else { result[i] = result[i-1]+i; flag[result[i-1]+i] = true; } } 带有具体注释代码能够在 取得 Pku acm 1953 World Cup Noise 动态计划题目总结(四) 给定一个小于45整数n,求n位2进制数中不含相邻1数个数。看似简单一道题,假如当n=45时,对245次方检验,是无法完成任务。先分析一下这个问题: N 以1结尾个数 以0结尾个数 总和 1 1 1 2 2 1 2 3 3 … … … 对于n=1来说,以1结尾、以0结尾个数全部是1,总和是2,下面过分到2:对于全部以1结尾数,后面全部能够加上0,变为n=2时以0结尾,而只有结尾为0数才能加上1(因为不能有两个连续0),这么就能够在n=2格里分别填上1、2,总和算出来为3,以这类推,我们能够算出全部n=45值,然后依据输入进行对应输出。关键代码以下: int i,num,count,array[50][2],j=0; array[1][1] = 1; array[1][0] = 1; for(i=2;i50;i++) { array[i][0] = array[i-1][1]; array[i][1] = array[i-1][1]+array[i-1][0]; } 我们能够继续找出规律,其实这个就是斐波那切数列数列: F[N] = F[N-1]+

文档评论(0)

1亿VIP精品文档

相关文档