上海大学算法设计实验二:矩阵连乘问题详解

需积分: 14 7 下载量 81 浏览量 更新于2024-11-29 2 收藏 11.86MB ZIP 举报
资源摘要信息:"SHU-算法设计实验二:矩阵连乘问题" 一、算法设计 矩阵连乘问题,又称为矩阵链乘积问题,是算法设计与分析领域的一个经典问题。该问题描述如下:给定一个矩阵链 \(A_1, A_2, ..., A_n\),其中每个矩阵 \(A_i\) 的维度为 \(p_{i-1} \times p_i\)(\(i=1,2,...,n\)),求计算矩阵连乘积 \(A_1 \times A_2 \times ... \times A_n\) 的最优括号化方案,即求最小的标量乘法次数。这个问题可以通过动态规划算法来解决,涉及到的算法设计知识点如下: 1. 动态规划:一种算法策略,它将一个复杂问题分解成更小的子问题,通过解决这些子问题来解决整个问题。在矩阵连乘问题中,动态规划用于记录子问题的最优解,避免重复计算。 2. 最优子结构:在动态规划中,问题的最优解包含其子问题的最优解。矩阵连乘问题中,要计算 \(A_{i..j}\) 的最小乘法次数,可以递归地求解 \(A_{i..k}\) 和 \(A_{k+1..j}\) 的最小乘法次数。 3. 重叠子问题:在递归调用过程中,相同的子问题会被多次计算。动态规划通过存储这些子问题的解来避免重复计算,提高效率。 4. 时间复杂度分析:矩阵连乘问题的时间复杂度与矩阵的维度数量有关,动态规划算法的时间复杂度一般为 \(O(n^3)\)。 二、实验内容 本实验要求学生能够编写一个完整的C++程序,实现矩阵连乘问题的动态规划算法,并提交可运行的代码。此外,学生还需要提交一份格式化的报告,报告中需要详细说明算法设计思路、算法步骤、以及代码实现的细节。实验中的知识点包括: 1. C++编程基础:掌握C++语言的基本语法和特性,能够熟练编写程序。 2. 数据结构:矩阵链乘积问题中会涉及到数组或向量等数据结构的使用,用来存储中间计算结果和最终的解。 3. 算法实现:能够将算法思路转化为代码逻辑,并实现整个算法过程。 4. 代码调试和测试:编写代码后,需要进行调试和测试,确保算法能够正确执行,并且能够处理各种边界情况。 5. 报告撰写:需要撰写一份格式化的报告,清晰地描述算法的设计过程,包括问题描述、算法思路、算法步骤、算法伪代码、代码实现及分析等部分。 三、上海大学相关 实验是上海大学计算机科学与技术专业或者相关专业课程的一部分。学生通过该实验可以加深对算法设计的理解,并提高解决实际问题的能力。实验的具体要求可能会根据上海大学的教学大纲和实验指导书而有所不同,但核心内容和知识点是通用的。 四、文件名称 文件名称“exam02”表明这是上海大学的第二个实验项目,通常在教学过程中,教师会布置一系列实验,让学生通过实践来加深对课程知识的理解和应用。 总结而言,本实验聚焦于矩阵连乘问题的算法设计与实现,通过动态规划算法来最小化矩阵连乘的计算代价。学生需要在理解问题的基础上,编写并调试C++程序,并撰写格式化的报告来展示他们的解决方案。通过本实验,学生可以加深对算法设计知识的理解,并提升编程实践能力。

给出dosbox画圆程序的前半部分代码,为该代码添加注释,在结尾给出简易流程说明 data segment shuc db 'draw a yuan: $' hua1 db 'input yuanxin and banjing(example:310,220 200): $' zifu db 20 dup(0) ;此段用以临时存放输入字符 shu db 20 dup(0) ; suan db 24 dup(0) ;用来存放计算圆过程中产生的临时数据 data ends stack segment stk db 16 dup(0) stack ends code segment assume cs:code, ds:data,ss:stack start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov dx,offset shuc ;显示输入C的提示字符 call showmsg call input ;输入字符c的处理 mov al,ds:[si] and al,11011111b ;便于大小写都识别,将字符转换成大写 cmp al,43h draw1: mov dx,offset hua1 call showmsg call input call zhuanshu call moshi mov bx,offset shu mov ax,ds:[bx] mov si,ax mov ax,ds:[bx+2] mov di,ax mov ax,ds:[bx+4] call drawyuan mov ax,4c00h int 21h ;--------------------------------------- input: ;实现键盘输入字符 mov bx,0 mov cx,20 re: mov ah,1h ;DOS中断 键盘键入回显,al为字符 int 21h cmp al,0dh ;0dh为回车的ASCII码 jz scx mov si,offset zifu mov [bx][si],al ;将输入的字符放到zifu区 inc bx loop re ret ;-------------------------------------- scx: ;条件跳转时对cx设置 mov cx,0 ret ;-------------------------------------- showmsg: ;用来显示提示字符 mov ah,9h int 21h ret ;-------------------------------------- moshi: ;屏幕显示模式 mov al,12h mov ah,0 int 10h ret ;------------------------------------- zhuanshu: ;将输入的ascII码转为数字 mov bx,offset zifu mov bp,offset shu mov cx,16 mov si,0 mov di,0 lei: mov al,ds:[bx][si] cmp al,0 jz scx sub al,30h mov dl,100 mul dl mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+1] sub al,30h mov dl,10 mul dl add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+2] sub al,30h add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax add si,4 add di,2 loop lei ret

2023-05-31 上传