01 动态规划初步

【引例】最短路径问题

【题目简述】给出你一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道 路,连线上的数值代表道路的长度。现在,想从城市A到达城市D,怎样走路程最短,最短 路程的长度是多少?

【方法1】如果采用枚举算法,分别枚举出4条路径,然后比较每条路经的长度,得出最优解10 ,路径为A->B1->C2->D。

【方法2】

如果我们采用分层递推的思想来做这个题目,会出现什么结果呢? 设F(i)表示从点A到达点i的最短距离,则有

F(A)=0 F(B1)=min{F(A)+5}=5 F(B2)=min{F(A)+2}=2 F(C1)=min{F(B1)+3}=8 F(C2)=min{F(B1)+2,F(B2)+7}=7 F(C3)=min{F(B2)+4}=6 F(D)=min{F(C1)+4,F(C2)+3,F(C3)+5}=10 所以从A到D的最短距离是10,路径为A->B1->C2->D。

比较上述两种方法:

方法1采用了枚举法对于边A->B1,A->B2,C2->D都计算了2次。

方法2采用逐层递推的方法,每条边只计算了1次。

因此,方法2比方法1优秀。 那么造成两种方法效率不同的根本原因是什么呢?从引例中可以看出,方法2采用的是逐层 递推的方法从根本上消除了枚举法对路径中部分重复路径的冗余运算。 由上例可以看出,整个问题分成了A、B、C、D四个阶段来做,每个阶段的数值计算只会跟 上一个阶段的数值相关,这样一直递推下去直到目标。

       即由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决 策序列,同时确定了完成整个过程的一条最优的活动路线。这种把一个问题看作是一个前后 关联且具有链状结构的多阶段过程,这过程称为多阶段决策过程,这种问题称为多阶段决策 问题。

       在多阶段决策的问题中,各个阶段采取的决策,一般来说是与时间或空间有关的,决策依 赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来,故有 “动态”的含义,我们称这种解决多阶段决策最优化的过程为动态规划。

【例1】数字三角形

【问题描述】
如下图所示,它是一个数字三角形。数字三角形中的数字为不超过100的正整数。
先规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。假设三角形的行
数<=100,编程求解从最顶层走到最底层的一条路径,使得沿该路径所经过的数字总和
最大,输出最大值。
【文件输入】
输入文件第一行为一个整数n(1<=n<=100),表示数字三角形的行数,接下来的n行
,分别是从最顶层到最底层的每一层中的数字。
【文件输出】
输出仅有一行为一个整数,表示要求的最大总和。

【题目简述】 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。 每一步可以走到左下方的点也可以到达右下方的点。

【题目分析】

我们现在这里讨论搜索如何实现

状态:目前在第x行第y列

行动:向左走,向右走 一个底边为4的三角形共有八种状态:

 【方法1:暴力搜索】

void dfs(int x,int y,int val)
{
	val+=a[x][y];//加上权值
	if(x==n-1)
	{
		if(val>ans) ans&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值