算法与分析实验报告模板
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }