信息学奥赛——动态规划实例分析及程序实现.pdfVIP

  • 27
  • 0
  • 约1.6万字
  • 约 14页
  • 2020-12-12 发布于江西
  • 举报

信息学奥赛——动态规划实例分析及程序实现.pdf

全国青少年信息学奥林匹克联赛 动态规划实例分析及程序实现 一、数字三角形 (图3. 1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处 的一条路 径,使该路径所经过的数字的总和最大。 ●每一步可沿左斜线向下或右斜线向下走; ●1<三角形行数≤100; ●三角形中的数字为整数0,1,…99; 输入数据: 由INPUT.TXT 文件中首先读到的是三角形的行数。 在例子中INPUT.TXT表示如下: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出数据: 把最大总和(整数)写入OUTPUT.TXT 文件。 上例为: 30 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (图3. 1-1) 二、算法分析 只要对该题稍加分析,就可以得出一个结论: 如果得到一条由顶至底的某处的一条最佳路径,那么对于该路径上的每一个中 间点来说,由顶至该中间点的路径所经过的数字和也为最大。因此该题是一个典型 的多阶段决策最优化 的问题。 我们采用动态规划中的顺推解法。按三角形的行划分阶段。若行数为n, 则可把 问题看作一个 n-1 个阶段的决策问题。从始点出发,依顺向求出第一阶段、第二阶 段,……,第 n-1 阶段中各决策点至始点的最佳路径,最终求出始点到终点的最佳 路径。 设: fk (Uk)━━从第k阶段中的点Uk 至三角形顶点有一条最佳路径, 该路径 所经过的 数字的总和最大,fk (Uk)表示为这个数字和; 由于每一次决策有两个选择,或沿左斜线向下,或沿右斜线向下,因此设 Uk1━━k-1阶段中某点Uk 沿左斜线向下的点; Uk2━━k-1阶段中某点Uk 沿右斜线向下的点; dk (Uk1)━━k阶段中Uk1 的数字; dk (Uk2)━━k阶段中Uk2 的数字; 因而可写出顺推关系式 fk (Uk)=max{fk-1 (Uk)+dk (Uk1),fk-1 (Uk)+dk (U k2)} f0 (U0)=0; K=1,2,3,4,……n 经过一次顺推,便可分别求出由顶至底N个数的N条路径,在这N条路径所经 过的N个 数字和中,最大值即为正确答案。 三、程序分析 根据上述顺推关系,我们编写程序如下: Program ID1P1; Const Maxn = 100; Type Node = Record Val, Tot : Integer { 当前格数字; 从[1,1]到当前格的路径所经过的数字和 } End; Var List : Array [1..Maxn, 1..Maxn] of Node; {计算表 } N, Max, { 行数, 最大总和 } I, J : Integer; {辅助变量 } Fi : Text; {文件变量 } Procedure Init; Begin Assign(Fi, INPUT.TXT); {文件名和文件变量连接 } Reset(Fi); {文件读准备 } Readln(Fi, N); {读三角形行数 } For i := 1 to N Do {读入三角形各格的数字 } For j := 1 to i Do Read(Fi, List[i, j].Val); Close(Fi) End; {init} Procedure Main; Begin List[1, 1].Tot := List[1, 1].Val; {从[1,1]位置开始往下顺推 } For i := 2 to N Do For j := 1 to i Do Begin List[i, j].Tot := -1; {从[1,1]至[i,j]的数字和初始化 } If (j 1) And (List[i - 1, j - 1].Tot + List[i

文档评论(0)

1亿VIP精品文档

相关文档