可视化计算(raptor)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用动态规划来解决数字三角形问题

软件34刘柏呈

问题由来

题目的出处是《可视化计算》课本讲贪心的一道例题(Page108,例3-4),选题的原因:一,老师要求用到动态规划的思想方法。二,raptor是个可视化的编程软件,突出可视化,就必须有图形,而数字三角形本身就是个“二叉树”综上

解题思路

先构图的顶点,随即生成边,构成树,各个顶点中的数字随机生成,这样就完成输入问题。再用动态规划寻找最大的路径,最后再运用可视化的特点,把选择的过程呈现给看程序的人。

1.首先是构图,出于美观性的考虑,我将数字三角形的可行层数控制为1-6层。由于

raptor没有编辑数组,所以我用两种方式为顶点编号:1,(i,j)来表示第i行第j

个数。2,用m表示,从上到下,从左到右的第m个点。之后就是,计算点的坐

标,找出坐标的规律,并适当的纪录。

2.动态规划,主要根据,状态转移方程:f[i,j]=max{f[i-1,j],f[i-1,j-

1]}+c[i,j]其中,f[i,j]表示到(i,j)点的最大累加和,c[i,j]表示第

(i,j)点的值。

3.显示用到递归的解法,根据之前纪录的“父节点”来搜索路径。

算法实现

第一个子图composition就是构图,用来画二叉树,i控制行数,j控制列数,二重循环来画圆和线。

注意点:

一,圆的大小应该适应画布和层数,所以我令k=画布高/层数,而用k/4作为半径画圆。

二,“线不能将圆戳破”即线的出发点不能是圆心,这里,我将上层圆的圆心与它的两个子圆的圆心连线的夹角令为60度,再根据圆中直角三角形的关系,算

出对应圆周上的点,作为出发点。

三,弄清一个循环中该做什么,结论是:画一个圆和两条线,这里要注意判断一下是否是最后一层,最后一层不需要画线。

dp子图是用来完成动态规划算法的,这个算法只要知道状态转移方程就比较好实现,需要注意的是边界的控制,所以需要附初值。还有就是,我每做一步用root数组纪录一下该点的“父亲”,以便之后查找。

maxchoose子程序用来比较大小,并返回一个o,帮助确定是“左”还是“右”被选了。

showresult和findroot就是用递归来回溯寻找自己“父节点的过程”

回顾与思考

次程序的缺点,就是编译过后已然极其的慢,但笔者没有找到“裁枝”的限制条件,希望看过此程序的读者能够发现。

参考文献:

运行结果

DP子图

Showresult子图

相关文档
最新文档