算法与分析实验报告模板

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

贵州大学计算机科学与技术学院

计算机科学与技术系上机实验报告

课程名称:算法设计与分析班级:实验日期:YYYY-MM-DD

姓名:学号:指导教师:程欣宇

实验序号:一实验成绩:

一、实验名称

分治算法实验- 棋盘覆盖问题

二、实验目的及要求

1、熟悉递归算法编写;

2、理解分治算法的特点;

3、掌握分治算法的基本结构。

三、实验环境

Visual C++

四、实验内容

根据教材上分析的棋盘覆盖问题的求解思路,进行验证性实验;

要求完成棋盘覆盖问题的输入、分治求解、输出。有余力的同学尝试消去递归求解。

五、算法描述及实验步骤

分治算法原理:

分治算法将大的分解成形状结构相同的子问题,并且不断递归地分解,直到子问题规模小到可以直接求解。

棋盘覆盖问题描述:

在一个2k x 2k个方格组成的棋盘中恰有一个方格与其他的不同称为特殊方格,想要求利用四种L型骨牌(每个骨牌可覆盖三个方格)不相互重叠覆盖的将除了特殊方格外的其他方格覆盖。

实验步骤:

1、定义用于输入和输出的数据结构;

2、完成分治算法的编写;

3、测试记录结构;

4、有余力的同学尝试不改变输入输出结构,将递归消除,并说明能否不用栈,直接消除递归,为什么?

六、调试过程及实验结果

详细记录程序在调试过程中出现的问题及解决方法。

记录程序执行的结果。

七、总结

对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。

八、附录

源程序(核心代码)清单或使用说明书,可另附纸

贵州大学计算机科学与技术学院

计算机科学与技术系上机实验报告

课程名称:算法设计与分析班级:实验日期:2014-11-25

姓名:学号:指导教师:程欣宇

实验序号:二实验成绩:

一、实验名称

动态规划实验- 滑雪问题

二、实验目的及要求

1、学会使用在线测评的算法题目评分系统;

2、通过直观的应用问题,加深对动态规划算法的理解;

三、实验环境

任意C或C++编写调试工具,北京大学ICPC在线测评系统POJ

四、实验内容

1、找到题号为1088的题目-滑雪,阅读题目,建立其最优解的递归表达式;

3、使用备忘录式的动态规划算法,实现本题;

4、进行简单测试,完成之后提交到POJ系统。

五、算法描述及实验步骤

动态规划算法原理:

分治算法将大的问题变成小的问题来解决,但是如果划分过程中出现重叠子问题,就可能导致大量的重复计算。为了避免这些重复的计算,可以考虑的一个办法就是动态规划算法。

为了使用动态规划算法,问题还必须具备最优子结构,即问题的最优解包含了子问题的最优解。

滑雪问题描述:

Michael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子

1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在

上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output

输出最长区域的长度。

实验步骤:

1、建立滑雪问题的解的递归表达式

请建立!

2、构造算法框架

请构造!

3、分析出算法复杂度

请分析!

六、调试过程及实验结果

详细记录程序在调试过程中出现的问题及解决方法。

记录程序执行的结果。

七、总结

对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。

八、附录

#include

#include

int R, C;

int a[101][101];

//各点高度

int f[101][101];

//各点最大滑雪长度

inline int max(int a, int b){ //inline表示编译时直接嵌入至调用处,节省调用函数的时间return a>b?a:b;

}

inline int max(int a, int b, int c, int d){

return max(max(a, b), max(c, d));

}

int dfs(int row, int col, int h){ //递归深搜

if(row < 1 || row > R || col < 1 || col > R || h <= a[row][col]) //超出范围或上一点高度低于该点高度

return 0; //则返回0

if(f[row][col] >= 0) //如果已经搜索过

return f[row][col]; //则直接返回该点最大化学长度

f[row][col] = max(dfs(row - 1, col, a[row][col]), dfs(row, col + 1, a[row][col]), dfs(row + 1, col, a[row][col]), dfs(row, col - 1, a[row][col])) + 1; //动规,当前最大滑雪长度为四周比该点低的最大滑雪长度加1

return f[row][col]; }

int main()

{ int T, i, j;

scanf("%d", &T);

while(T--)

{ int max = 0;

memset(f, -1, sizeof(f));

scanf("%d%d", &R, &C);

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

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

{ scanf("%d", &a[i][j]); }

} for(i = 1; i <= R; ++i)

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

{ int num = dfs(i, j, 0xffffff); //通过16进制0xffffff方便地给出一个足够大的int型

if(max < num) max = num; }

} printf("%d\n", max); }

return 0; }

相关文档
最新文档