- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
数塔问题
例数塔问题
有形如右图的一个数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的数值和最大。
9
1215
1068
21895
19710416
问题分析
数组存放下三角数据
口算结果?
9-12-10-18-10
1贪婪算法
贪婪策略?
是否满足贪婪选择性质?
是否满足最优子结构性质?
2枚举
最保险的思路,列举出所有可能的路径再比较,得出和最大的路径。
重复工作:
循环、递归。
2枚举-递归
算法1
inta[100][100];//下三角形存放数据
intmax(inti,intj,intn)//递归函数
{
intleft,right;
if((i==n)||(j==n))//到达边缘
returna[i][j];
left=max(i+1,j,n);//左边
right=max(i+1,j+1,n);//右边
return(leftright)?(left+a[i][j]):(right+a[i][j]);
}
重叠子问题:计算了两次18的最大路径。
3动态规划的手工计算
9
1215
1068
21895
19710416
阶段5
阶段4
阶段3
阶段2
(21)
(28)
(19)
(21)
(38)
(34)
(29)
(50)
(49)
(59)
决策
决策
决策
决策
阶段1
59
5049
383429
21281921
19710416
取第i行第j个数,一般有两种方案。
3动态规划的手工计算
9
1215
1068
21895
19710416
(33)
(49)
(41)
(37)
(31)
(30)
(32)
(21)
(24)
(52)
(56)
(59)
(45)
(53)
决策
决策
决策
决策
阶段1
阶段2
阶段3
阶段4
阶段5
3动态规划的手工计算
顺序与逆序解法本质上无区别;
一般当初始状态唯一给定时可用逆序解法;
如需比较到达不同终点状态的各个路径及最大结果时,使用顺序法比较简便;
如需知道塔中每一点到最下层的最大值和路径时,使用逆序法比较简便。
4动态规划的算法实现
原始信息存储
层数用整型变量n存储;
数塔中的数据用二维数组data[][]存储,下三角阵。
动态规划过程存储
必须用二维数组d[][]存储各阶段的决策结果。二维数组d的存储内容如下:
d[n][j]=data[n][j],其中j=1,2,……,n;
d[i][j]=max(d[i+1][j],d[i+1][j+1])+data[i][j],其中i=n-1,n-2,……1,j=1,2,……,i;
逆序法
59
5049
383429
21281921
19710416
最后d[1][1]存储的就是问题的最大值。
可以通过分析d,得到路径。
4动态规划的算法实现
输出data[1][1]“9”;
b=d[1][1]-data[1][1]=59-9=50b与d[2][1],d[2][2]比较b与d[2][1]相等,输出data[2][1]“12”;
b=d[2][1]-data[2][1]=50-12=38b与d[3][1],d[3][2]比较b与d[3][1]相等,输出data[3][1]“10”;
b=a[3][1]-data[3][1]=38-10=28b与d[4][1],d[4][2]比较b与d[4][2]相等,输出data[4][2]“18”;
b=d[4][2]-data[4][2]=28-18=10b与d[5][2],d[5][3]比较b与d[5][3]相等,输出data[5][3]“10”。
数组d
59
5049
383429
21281921
19710416
数组data
9
1215
1068
21895
19710416
4动态规划
文档评论(0)