动态规划初步

动态规划的理论性和实践性都比较强,一方面需要理解“状态”、“状态转移”、“最优子结构”、“重叠子问题”等概念,另一方面又需要根据题目的条件灵活设计算法。可以这样说,对动态规划的掌握情况在很大程度上能直接影响一个选手的分析和建模能力。

动态规划是一种用途很广的问题求解方法,它本身并不是一个特定的算法,而是一种思想,一种手段。下面通过一个题目阐述动态规划的基本思路和特点。

数字三角形

有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,如下图:
数字三角形
从第一行的数开始,每次可以往左下或右下走一格,直到走到最下面一行,把沿途经过的数全部加起来。如何走才能使得这个和尽量大?

【分析】

把当前的位置(i,j)看成一个状态,然后定义状态(i,j)的指标函数d(i,j)为从格子(i,j)出发时能得到的最大和(包括格子(i,j)本身的值)。
转移过程:从格子(i,j)出发有两种策略。如果往左走,则走到(i+1,j)后需要求“从(i+1,j)出发后能得到的最大和”这一问题,即d(i+1,j)。类似地,往右走之后需要求解d(i+1,j+1)。由于可以在这两个决策中自由选择,所以应选择d(i+1,j)和d(i+1,j+1)中较大的一个。换句话说,得到了所谓的状态转移方程:

d(i,j) = a(i,j) + max{d(i+1,j),d(i+1,j+1)}

动态规划的核心是状态和状态转移方程。

下面给出一个蓝桥杯省赛真题:

在这里插入图片描述
在这里插入图片描述

程序算法(Python版):
n = int(input())
a = []
for i in range(n):
    b = list(map(int,input().split()))
    a.append(b)
d = a[:]

for i in range(1,n):
    for j in range(i+1):
        if j == 0:
            d[i][j] = a[i-1][j] + a[i][j]
        elif j == i:
            d[i][j] = a[i-1][j-1] + a[i][j]
        else:
            d[i][j] = max(a[i-1][j],a[i-1][j-1]) + a[i][j] # 动规方程
if n % 2 == 0:
    print(max(d[-1][n//2-1],d[-1][n//2]))
else:
    print(c[-1][n//2])

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值