动态规划(一) 数塔,嵌套矩形问题

本文介绍了动态规划在解决数塔问题和有向无环图(DAG)上的嵌套矩形问题的应用。通过状态转移方程解析问题,并探讨了递归、递推和记忆化搜索等不同解法,强调了优化计算效率和确保每个节点仅计算一次的重要性。此外,还提供了样例代码和问题分析,帮助理解解题思路。
摘要由CSDN通过智能技术生成

1 数塔问题

1.1 思路 

把每一个点看成一个状态,即从每个状态开始到达终点的最大值称为它的状态值,由此可见,每一个点的最大值,与它所连的两个点的状态值的大小密切相关。对此,我们引出一个方程。

状态转移方程d(i, j) = a(i, j) + max{d(i + 1, j), d(i + 1, j + 1)}

1.2 解决方法

方法一:递归计算

int solve(int i, int j){
	return a[i][j] + (i == n ? 0 : max(solve(i + 1, j),solve(i + 1, j + 1)));
}

大家可以看到,这样做有些点会计算到两次,所以它的效率还不是最高的。

方法二:递推计算

int i, j;
for(j = 1; j <= n; j++) d[n][j] = a[n][j];
for(i = n - 1; i >= i; j++)
	for(j = 1; j <= i; j++)
		d[i][j] = a[i][j] + max(d[i + 1][j], d[i + 1][j + 1]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mypollyanna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值