zoukankan      html  css  js  c++  java
  • 动态规划-数字三角形V1

    数字三角形
    7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5
    在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。
    路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。
    三角形的行数大于1小于等于100,数字为 0 - 99

    输入格式:
    5 //三角形行数。下面是三角形
    7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5
    要求输出最大和

    解题思路:使用动态规划,构建二维数组,数组中的数值表示到达当前节点的累计最大值,
    运用动态规划解决的问题必须是希望在每个子问题上获得最优解(称为最优子结构)

    用二维数组存放数字三角形。D( r, j) : 第r行第 j 个数字(r,j从1开始算)
    MaxSum(r, j) : 从D(r,j)到底边的各条路径中,最佳路径的数字之和。
    问题:求 MaxSum(1,1),典型的递归问题。
    D(r, j)出发,下一步只能走D(r+1,j)或者D(r+1, j+1)。故对于N行的三角形:
    if ( r == N)
    MaxSum(r,j) = D(r,j)
    else
    MaxSum( r, j) = Max{ MaxSum(r+1,j), MaxSum(r+1,j+1) }+ D(r,j)

    Python代码实现:
     1 # 为了方便计算,数组的值从1,1位置开始存储
     2 d = [[0] *101 for j in range(101)]
     3 
     4 
     5 def MaxSum(i, j, rows):
     6     if i == rows:
     7         return d[i][j]
     8     else:
     9         x = MaxSum(i + 1, j, rows)
    10         y = MaxSum(i + 1, j + 1, rows)
    11         return max(x, y)+d[i][j]
    12 def main():
    13     global d
    14     lines = int(input("请输入行数:"))
    15     for i in range(lines):
    16         line = input().split()
    17         for j in range(i + 1):
    18             d[i + 1][j + 1] = int(line[j])
    19     # print(d)
    20     maxPath = MaxSum(1,1,lines)
    21     print("最大路径值为:%d"%maxPath)
    22 
    23 if __name__ == "__main__":
    24     main()
     
  • 相关阅读:
    [docker]Kubernetes的yaml文件
    [redis]redis-cluster的使用
    [redis]redis-cluster搭建
    [docker]本地仓库的创建的使用
    1W字看懂互联网知识经济
    PHP基础陷阱题(变量赋值)
    PHP不用第三变量交换2个变量的值的解决方法
    PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
    PHP实现四种基本排序算法
    WEB安全之Token浅谈
  • 原文地址:https://www.cnblogs.com/an-wl/p/12855651.html
Copyright © 2011-2022 走看看