BX110937李建辉算法设计实验六

  • 格式:docx
  • 大小:110.80 KB
  • 文档页数:11

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子信息学院

实验报告书

评语:

实验态度:认真()一般()较差()

实验结果:正确()部分止确()错()

实验理论:掌握()熟悉()了解()生疏()操作技能:较强()一般()较差()

实验报告:较好()一般()较差()

成绩:指导教师:-王淮亭

批阅时间:2014年05月05日

1. 实验目的

(1) 初步掌握动态规划算法

(2)

能够运用动态规划的思想解决实际问题,如矩阵连乘问题等

2. 实验要求

(1)

n 个矩阵连乘问题。

(2) 应用顺推实现动态规划求解 n 行m 列边数值矩阵最大的路程,已知n 行m 列的边数值矩阵, 每一个点

可向右或向下两个去向,试求左上角顶点到右下角顶点的所经边数值和最大的路程。 (3)

求解点数值矩阵最小路径,随机产生一个

n 行m 列的整数矩阵,在整数矩阵中寻找从左上

角至右下角,每步可向下(D)或向右(R)或斜向右下(0)的一条数值和最小的路径。 (4) 应用递推实现动态规划求解序列的最小子段和。 (5)

插入加号求最小值

,在一个n 位整数a 中插入r 个加号,将它分成r+1个整数,找出一

种加号的插入方法,使得这 r+1个整数的和最小。

3. 实验原理

动态规划的基本思想:动态规划法的实质也是将较大问题分解为较小的同类子问题,这一点上 它与分治法和贪心法类似。但动态规划法有自己的特点。分治法的子问题相互独立,相同的子问题 被重复计算,动态规划法解决这种子问题重叠现象。贪心法要求针对问题设计最优量度标准,但这 在很多情况下并不容易。动态规划法利用最优子结构,自底向上从子问题的最优解逐步构造出整个 问题的最优解,动态规划则可以处理不具备贪心准则的问题

4. 实验设备

PC 机

5. 实验步骤

(1) 刻画最优解的结构特性; (2) 递归定义最优解值;

(3) 以自底向上方式计算最优解值; (4)

根据计算得到的信息构造一个最优解。

其中,第(1 )至(3)步是动态规划算法的基本步骤。最优解值是最优解的目标函数的值

6. 实验结果

行劇

法加 P

白白白白詞 1

巨巨巨巨民

旳戈买BB^f ¥

胆2LX

序年

入入

辎0

前前前融淨

■十;\和冈细朗U^\计尊机幫用亘法和齢诒计谋眸\计諒叽氢迭实那D 亡匕口熱吕注与宅畑*

三.回

TbJJ

7 •实验体会

通过这次实验加深了我对动态规划算法的理解,通过这五个实验使我熟练掌握动态规划算法, 使我对动态规划算法,分治法,贪心算法有了区别的认识,动态规划算法融合了分治法和贪心法的 优点,更好的解决问题,实验有利于加深理论的理解,非常实用。

附:源程序

第一题源程序: #in elude void mai n()

{in t d,n ,i,j,k,t,r[1OO],m[1OO][1OO]; printf (”

请输入矩阵的个数 n:");

2

1

请4

c

-&

列0 整28

九序yt 丁4,亦ke -2

y 需。子子an

个2--- Press

图6-1 n 个矩阵连乘问题

图6-2应用顺推实现动态规划求解

n 行m 列边数值矩阵最大的路程

4

24,

图6-3递推实现动态规划求解序列的最小子段和

图6-4插入加号求最小值

int a[50][50],l[50][50],r[50][50];char st[50][50]; t=time()%1000;sra nd(t);

prin tf(" 请输入数字三角形的行数n:"); sca nf("%d",&n);

for(i=1;i

for(j=1;j<=33;j++) pri ntf(" ");pri ntf(" A \n ”);

for(i=1;i<=n ;i++)

{for(j=1;j<=37-4*i;j++) pri ntf("");

for(j=1;j<=i;j++) pri ntf(" . "); prin tf("\n\n");

for(j=1;j<=36-4*i;j++) pri ntf("");

for(j=1;j<=i;j++)

{l[i][j]=ra nd()/1000+1;pri ntf("%4d",l[i][j]);

r[i][j]=ra nd()/1000+1;pri ntf("%4d",r[i][j]);} prin tf("\n");}

for(j=1;j<=37-4*(n+1);j++) printf("");

for(j=1;j<=n+1;j++) printf(".");

printf(”底边\n\n ”);

for(i=n;i>=1;i--)

{for(j=1;j<=i;j++)

if(a[i+1][j]+l[i][j]

{a[i][j]=a[i+1][j]+l[i][j];st[i][j]=T;}

else

{a[i][j]=a[i+1][j+1]+r[i][j];st[i][j]='r';}

}

prin tf("\n 最短路程为:%d",l[1][1]);

prin tf("\n 最短路径为:顶点A ");