重庆大学算法导论跳桩得珠宝问题项目报告(包含报告和源代码)

合集下载

算法导论课程作业答案

算法导论课程作业答案

算法导论课程作业答案Introduction to AlgorithmsMassachusetts Institute of Technology 6.046J/18.410J Singapore-MIT Alliance SMA5503 Professors Erik Demaine,Lee Wee Sun,and Charles E.Leiserson Handout10Diagnostic Test SolutionsProblem1Consider the following pseudocode:R OUTINE(n)1if n=12then return13else return n+R OUTINE(n?1)(a)Give a one-sentence description of what R OUTINE(n)does.(Remember,don’t guess.) Solution:The routine gives the sum from1to n.(b)Give a precondition for the routine to work correctly.Solution:The value n must be greater than0;otherwise,the routine loops forever.(c)Give a one-sentence description of a faster implementation of the same routine. Solution:Return the value n(n+1)/2.Problem2Give a short(1–2-sentence)description of each of the following data structures:(a)FIFO queueSolution:A dynamic set where the element removed is always the one that has been in the set for the longest time.(b)Priority queueSolution:A dynamic set where each element has anassociated priority value.The element removed is the element with the highest(or lowest)priority.(c)Hash tableSolution:A dynamic set where the location of an element is computed using a function of the ele ment’s key.Problem3UsingΘ-notation,describe the worst-case running time of the best algorithm that you know for each of the following:(a)Finding an element in a sorted array.Solution:Θ(log n)(b)Finding an element in a sorted linked-list.Solution:Θ(n)(c)Inserting an element in a sorted array,once the position is found.Solution:Θ(n)(d)Inserting an element in a sorted linked-list,once the position is found.Solution:Θ(1)Problem4Describe an algorithm that locates the?rst occurrence of the largest element in a?nite list of integers,where the integers are not necessarily distinct.What is the worst-case running time of your algorithm?Solution:Idea is as follows:go through list,keeping track of the largest element found so far and its index.Update whenever necessary.Running time isΘ(n).Problem5How does the height h of a balanced binary search tree relate to the number of nodes n in the tree? Solution:h=O(lg n) Problem 6Does an undirected graph with 5vertices,each of degree 3,exist?If so,draw such a graph.If not,explain why no such graph exists.Solution:No such graph exists by the Handshaking Lemma.Every edge adds 2to the sum of the degrees.Consequently,the sum of the degrees must be even.Problem 7It is known that if a solution to Problem A exists,then a solution to Problem B exists also.(a)Professor Goldbach has just produced a 1,000-page proof that Problem A is unsolvable.If his proof turns out to be valid,can we conclude that Problem B is also unsolvable?Answer yes or no (or don’t know).Solution:No(b)Professor Wiles has just produced a 10,000-page proof that Problem B is unsolvable.If the proof turns out to be valid,can we conclude that problem A is unsolvable as well?Answer yes or no (or don’t know).Solution:YesProblem 8Consider the following statement:If 5points are placed anywhere on or inside a unit square,then there must exist two that are no more than √2/2units apart.Here are two attempts to prove this statement.Proof (a):Place 4of the points on the vertices of the square;that way they are maximally sepa-rated from one another.The 5th point must then lie within √2/2units of one of the other points,since the furthest from the corners it can be is the center,which is exactly √2/2units fromeach of the four corners.Proof (b):Partition the square into 4squares,each with a side of 1/2unit.If any two points areon or inside one of these smaller squares,the distance between these two points will be at most √2/2units.Since there are 5points and only 4squares,at least two points must fall on or inside one of the smaller squares,giving a set of points that are no more than √2/2apart.Which of the proofs are correct:(a),(b),both,or neither (or don’t know)?Solution:(b)onlyProblem9Give an inductive proof of the following statement:For every natural number n>3,we have n!>2n.Solution:Base case:True for n=4.Inductive step:Assume n!>2n.Then,multiplying both sides by(n+1),we get(n+1)n!> (n+1)2n>2?2n=2n+1.Problem10We want to line up6out of10children.Which of the following expresses the number of possible line-ups?(Circle the right answer.)(a)10!/6!(b)10!/4!(c) 106(d) 104 ·6!(e)None of the above(f)Don’t knowSolution:(b),(d)are both correctProblem11A deck of52cards is shuf?ed thoroughly.What is the probability that the4aces are all next to each other?(Circle theright answer.)(a)4!49!/52!(b)1/52!(c)4!/52!(d)4!48!/52!(e)None of the above(f)Don’t knowSolution:(a)Problem12The weather forecaster says that the probability of rain on Saturday is25%and that the probability of rain on Sunday is25%.Consider the following statement:The probability of rain during the weekend is50%.Which of the following best describes the validity of this statement?(a)If the two events(rain on Sat/rain on Sun)are independent,then we can add up the twoprobabilities,and the statement is true.Without independence,we can’t tell.(b)True,whether the two events are independent or not.(c)If the events are independent,the statement is false,because the the probability of no rainduring the weekend is9/16.If they are not independent,we can’t tell.(d)False,no matter what.(e)None of the above.(f)Don’t know.Solution:(c)Problem13A player throws darts at a target.On each trial,independentlyof the other trials,he hits the bull’s-eye with probability1/4.How many times should he throw so that his probability is75%of hitting the bull’s-eye at least once?(a)3(b)4(c)5(d)75%can’t be achieved.(e)Don’t know.Solution:(c),assuming that we want the probability to be≥0.75,not necessarily exactly0.75.Problem14Let X be an indicator random variable.Which of the following statements are true?(Circle all that apply.)(a)Pr{X=0}=Pr{X=1}=1/2(b)Pr{X=1}=E[X](c)E[X]=E[X2](d)E[X]=(E[X])2Solution:(b)and(c)only。

金块问题_实验报告

金块问题_实验报告

一、实验目的1. 理解分金块问题的背景和意义;2. 掌握分治法的基本思想及其在解决分金块问题中的应用;3. 比较不同算法在解决分金块问题时的性能;4. 提高编程能力和算法设计能力。

二、实验内容1. 问题概述分金块问题是一个经典的算法问题。

问题描述如下:老板有n个金块,希望最优秀的雇员得到其中最重要的一块,最差的雇员得到其中最轻的一块。

假设有一台比较重量轻重的天平,要求设计一个算法,在尽可能少的比较次数内,将金块分为三组,使得最优秀的雇员得到最重的金块,最差的雇员得到最轻的金块。

2. 算法分析针对分金块问题,我们可以采用以下两种算法:(1)蛮力法(非递归)蛮力法的基本思想是:遍历所有可能的分组方式,找出最优解。

具体步骤如下:① 将n个金块依次编号为1至n;② 遍历所有可能的分组方式,即从第一个金块开始,将其与其他金块进行分组,然后继续对剩余的金块进行分组,直到分组完毕;③ 对于每一种分组方式,分别找出最重的金块和最轻的金块,并比较其重量;④ 找出所有分组方式中最优的分组方式,即最重的金块和最轻的金块的重量差最小。

(2)分治法分治法的基本思想是将大问题分解为若干个小问题,递归地解决这些小问题,然后合并其结果。

具体步骤如下:① 当n=1时,直接返回该金块;② 将n个金块随机分为两组,分别编号为A和B;③ 分别对A组和B组递归调用分治法,找出每组中的最重金块和最轻金块;④ 比较A组最重金块和A组最轻金块的重量差,以及B组最重金块和B组最轻金块的重量差;⑤ 根据比较结果,确定最终的最重金块和最轻金块。

三、实验步骤1. 实验环境:Python 3.72. 实验数据:随机生成100个金块,重量在1至1000之间。

3. 实验代码(1)蛮力法实现```pythondef brute_force(n):# 初始化金块重量列表weights = [i for i in range(1, n+1)]# 遍历所有可能的分组方式for i in range(1, n//2+1):for j in range(i+1, n-i+1):for k in range(j+1, n-j+1):# 计算分组方式下的最重金块和最轻金块的重量差diff_a = max(weights[i-1:k]) - min(weights[i-1:k])diff_b = max(weights[k:n]) - min(weights[k:n])# 更新最优解if diff_a < diff_b:best_a = max(weights[i-1:k])best_b = min(weights[i-1:k]) else:best_a = max(weights[k:n]) best_b = min(weights[k:n]) return best_a, best_b# 测试n = 100print(brute_force(n))```(2)分治法实现```pythondef divide_and_conquer(weights, left, right):# 当只剩一个金块时,返回该金块if left == right:return weights[left]# 将金块分为两组mid = (left + right) // 2max_a = max(weights[left:mid])min_a = min(weights[left:mid])max_b = max(weights[mid:right+1])min_b = min(weights[mid:right+1])# 比较两组金块的重量差if max_a - min_a < max_b - min_b:return max_a, min_aelse:return max_b, min_b# 测试n = 100weights = [i for i in range(1, n+1)]print(divide_and_conquer(weights, 0, n-1))```四、实验结果与分析1. 实验结果(1)蛮力法:当n=100时,运行时间约为0.6秒;(2)分治法:当n=100时,运行时间约为0.001秒。

算法导论课程设计报告_棋盘移动棋子问题

算法导论课程设计报告_棋盘移动棋子问题

一、设计内容与设计要求1.设计内容:对课程《算法导论》中的常用算法进行综合设计或应用(具体课题题目见后面的供选题目)。

2.设计要求:●课程设计报告正文内容(一)问题的描述;(二)算法设计与分析,内容包括1,算法设计,对问题的分析和算法的设计2,算法描述,以伪代码形式的算法3,算法分析,主要是算法的正确性和运行时间的分析(三)算法实现所有程序的原代码,要求用C语言程序实现,并对程序写出必要的注释。

●书写格式a.要求用A4纸打印成册b.正文格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。

c.正文的内容:正文总字数要求在3000字左右(不含程序原代码)。

G.封面格式如下页。

●考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。

具体考核标准包含以下几个部分:a.平时出勤(占10%)b.系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)c.程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)G.设计报告(占30%)e.独立完成情况(占10%)。

注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。

课程验收要求a.判定算法设计的合理性,运行相关程序,获得正确的数值结果。

b.回答有关问题。

c.提交课程设计报告。

G.提交软盘(源程序、设计报告文档)。

e.依内容的创新程度,完善程序情况及对程序讲解情况打分。

一、问题描述(一)问题的描述假设有一张n*n个方格的棋盘以及一个棋子。

必须根据以下的规则把棋子从棋盘的底边移动到棋盘的顶边。

在每一步你可以把棋子移动到三个方格中的一个:1) 正上方的方格2) 左上方的方格(只能当这个棋子不在最左列的时候)3) 右上方的方格(只能当这个棋子不在最右列的时候)每移动到一个方格就会得到相应方格内的钱。

算法设计分析重庆大学练习题库及答案

算法设计分析重庆大学练习题库及答案

1、算法分析中,记号O表示()•A、渐进上界•B、非紧上界•C、非紧下界•D、2、在找零钱问题中,收银员算法中所应用的贪心规则的最恰当描述是()。

•A、总是选择面值最高的硬币•B、总是选择不超过剩余应找钱数的最大面值的硬币•C、总是选择面值是10,5的倍数的硬币•3、由边界条件出发,通过递推式求f(n)的值,从边界到求解的全过程十分清楚的是()•A、贪心•B、递推•C、递归•4、考虑最长公共子序列问题的下述递归表达式,如果全部子问题组织在一个c[i,j]的二维表格中,则c[i,j]不依赖于下述哪个子问题:()。

•A、同一行的上一列•B、同一列的上一行•C、上一行的上一列•5、算法的时间复杂度是指()•A、执行算法程序所需要的时间•B、算法程序的长度•C、算法执行过程中所需要的基本运算次数•6、活动选择问题就是在所给的活动集合中,选出()的相容活动子集。

•A、当前可选活动中结束时间最早的活动•B、当前可选活动中开始时间最早的活动•C、当前可选活动中冲突数量最少的活动•7、一个长度为n英寸的钢管的最优切割问题,总共有( )个不同的子问题。

•A、n+1•B、n2•C、nlogn•8、最优二叉搜索树的时间复杂度为()。

•A、O(n)•B、O(n!)•C、O(n2)•9、算法的每种运算必须要有确切的定义,不能有二义性,以下符合算法确定性运算的是()•A、5/0•B、将6或7与x相加•C、未赋值变量参与运算•10、对于三个物体的背包问题,问题相关的数据为n=3, M=20,P=(25,24,15),W(18,15,10)。

下面给出的四个可行解中,最好的是()•A、(1/2,1/3,1/4)•B、(1,2/15,0)•C、(0,2/3,1)••A、f(0)=0•B、f(1)=1•C、f(0)=1•12、下面关于快速排序的说法,正确的是()•A、快速排序的速度和数据无关,是一个固定的值•B、快速排序的速度在分解的均匀的时候效果最好,速度最快•C、快速排序主要的时间花在合并上面•D、•A、货郎担问题是求取具有最大成本的周游路线问题•B、货郎担问题适合使用贪心算法求问题的最优解•C、货郎担问题存在多项式时间算法•14、实现快速排序算法如下: QuickSort (A, p, r)IF p < r THENq ← Partition(A, p, r)( )QuickSort(A, q+1, r)•A、QuickSort(A,q-1,r)•B、QuickSort(A,q-1,r)•C、QuickSort(A,q+1,r)•哪个是对的()。

《算法设计与分析》课程实验报告 (回溯法(二))

《算法设计与分析》课程实验报告 (回溯法(二))

《算法设计与分析》课程实验报告实验序号:10实验项目名称:实验十一回溯法(二)一、实验题目1.图的着色问题问题描述:给定无向连通图G和m种不同的颜色。

用这些颜色为图G的各顶点着色,每个顶点着一种颜色。

如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。

图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。

2.旅行商问题问题描述:给出一个n个顶点的带权无向图,请寻找一条从顶点1出发,遍历其余顶点一次且仅一次、最后回到顶点1的最小成本的回路——即最短Hamilton回路。

3.拔河比赛问题描述:某公司的野餐会上将举行一次拔河比赛。

他们想把参与者们尽可能分为实力相当的两支队伍。

每个人都必须在其中一只队伍里,两队的人数差距不能超过一人,且两队的队员总体重应该尽量接近。

4.批处理作业调度问题描述:给定n个作业的集合J=(J1,J2, .. Jn)。

每个作业J都有两项任务分别在两台机器上完成。

每个作业必须先由机器1处理,再由机器2处理。

作业i需要机器j的处理时间为tji(i=1,2, ..n; j=1,2)。

对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间,则所有作业在机器2上完成处理的时间和,称为该作业调度的完成时间和。

批处理作业调度问题要求,对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。

二、实验目的(1)通过练习,理解回溯法求解问题的解状态空间树与程序表达的对应关系,熟练掌握排列树、子集树的代码实现。

(2)通过练习,体会减少搜索解空间中节点的方法,体会解的状态空间树的组织及上界函数的选取对搜索的影响。

(3)通过练习,深入理解具体问题中提高回溯算法效率的方法。

(4)(选做题):在掌握回溯法的基本框架后,重点体会具体问题中解的状态空间搜索时的剪枝问题。

三、实验要求(1)每题都必须实现算法、设计测试数据、记录实验结果,并给出时间复杂度分析。

四、实验过程(算法设计思想、源码)1.图的着色问题(1)算法设计思想用邻接矩阵a[i][j]存储无向图,对于每一个顶点有m种颜色可以涂。

重庆大学算法导论跳桩得珠宝问题项目报告(包含报告和源代码)

重庆大学算法导论跳桩得珠宝问题项目报告(包含报告和源代码)

大学项目报告项目题目:跳桩得珠宝问题学院:专业班级:计科年级:2011级姓名:学号:完成时间:2013 年 6 月7 日指导教师:波大学教务处制项目报告正文一.问题描述有m排n列的柱桩,每一排的柱桩从左向右标号为1,2,…,n,且在每个柱桩上预先放好价值不一样的宝石。

现在有位杂技演员从第一排的第1号柱桩开始跳跃,每次都必须跳到下一排的柱桩上,且每次跳跃最多只能向左或向右移动一个桩子。

也就是说如果现在杂技演员站在第j号桩上,那么他可跳到下一排的第j号桩上,也可跳到下一排的第j-1 (if j>1)或者j+1 (if j<n) 号桩上,并得到桩上的宝石。

计算出一条最佳的跳跃顺序,使杂技演员获得的宝石的总价值最大。

二.算法思想问题抽象:对于这个问题,可以抽象为:从顶部出发,在每一结点可以选择向左走,向下走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。

问题分析:这道题如果用枚举法,在数塔层数稍大的情况下(如40),则需要列举出的路径条数将是一个非常庞大的数目。

如果用贪心法又往往得不到最优解。

在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算。

于是在确定使用动态规划的情况下,对该问题进行分析。

算法思想:从顶点出发时到底向左走,向下走还是向右走应取决于是从哪个方向走能取到最大值,只要左中右三道路径上的最大值求出来了才能作出决策。

同样的道理下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。

这样一层一层推下去,直到倒数第二层时就非常明了。

所以实际求解时,可从底层开始,层层递进,最后得到最大值。

首先,我可以确定,对于矩阵可以用一个二维数组dp储存它,并且可以用(i,j)描述一个数字在矩阵中的位置。

对于中间的一个点来说,想经过它则必须经过它的上方或左上或右上,也就是说经过这个点的数字和最大等于经过上方或左上方或右上方的所得的“最大和”中一个更大的加上这个点中的数字。

重庆大学数字逻辑实验报告

重庆大学数字逻辑实验报告
管脚分配:
4、实验结果及分析和(或)源程序调试过程
仿真结果:
RTL分析:
效果图:
J15为输入a,L16为输入b,M13为输入s,H17为输出c
当s为0,输出为a的输入,如下图
当s为1,输出为b的输入,如下图
6)综合、实现、生成bit流,下载到Nexys4开发板进行验证;三、实Biblioteka 过程或算法真值表:s
a
b
c
0
0
0
0
0
0
1
0
0
1
0
1
0
1
1
1
1
0
0
0
1
0
1
1
1
1
0
0
1
1
1
1
Block Design:
Verilog代码:
module shiyan2(
input a,
input b,
input s,
output c
一实验目的多路选择器ip核的封装与调用二实验项目内容1将实验一中的与门演示过程或门非门与非门等基本门电路封装成ip2调用封装的ip核用blockdesign设计一个一位的2多路选择器可演示过程
《脉冲电路与数字逻辑》实验报告
姓名
王博韬
年级
2015级
学号
20154320
专业、班级
计科6
实验名称
多路选择器--IP核的封装与调用
2)调用封装的IP核,用Block Design设计一个一位的2选1多路选择器(可演示过程);
3)用verilogHDL语言编写一个一位的2选1多路选择器(可提供代码);
4)分别用RTL分析2)、3)中的电路设计(学会看RTL电路图);

算法分析实验一报告

算法分析实验一报告

《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.1.彼岸内容描述:突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。

现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei 必定会在该空间上碰到一种颜色的珠子。

如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。

比如经过长度为3的悬崖,碰到的珠子先后为“红黄蓝”,或者“蓝红黄”等类似情况就会坠落,而如果是“红黄红”或者“红黄黄”等情况则可以安全到达。

现在请问:yifenfei安然抵达彼岸的方法有多少种?输入:输入数据首先给出一个整数C,表示测试组数。

然后是C组数据,每组包含一个正整数n (n<40)。

输出:对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。

每组输出占一行。

例如:输入:2 输出:92 2132.统计问题内容描述:在一无限大的二维平面中,我们做如下假设:1、每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。

输入:首先给出一个正整数C,表示有C组测试数据接下来的C行,每行包含一个整数n (n<=20),表示要走n步。

输出:请编程输出走n步的不同方案总数;每组的输出占一行。

例如:输入:2 输出:31 723.Message Decowing内容描述:The cows are thrilled because they've just learned about encrypting messages. Theythink they will be able to use secret messages to plot meetings with cows on other farms.Cows are not known for their intelligence. Their encryption method is nothing like DES or BlowFish or any of those really good secret coding methods. No, they are using a simple substitution cipher.The cows have a decryption key and a secret message. Help them decode it. The key looks like this:yrwhsoujgcxqbativndfezmlpkWhich means that an 'a' in the secret message really means 'y'; a 'b' in the secret message really means 'r'; a 'c' decrypts to 'w'; and so on. Blanks are not encrypted; they are simply kept in place. Input text is in upper or lower case, both decrypt using the same decryption key, keeping the appropriate case, of course.输入:* Line 1: 26 lower case characters representing the decryption key* Line 2: As many as 80 characters that are the message to be decoded输出:* Line 1: A single line that is the decoded message. It should have the same length as the second line of input.例如:输入:eydbkmiqugjxlvtzpnwohracsfKifq oua zarxa suar bti yaagrj fa xtfgrj输出:Jump the fence when you seeing me coming二、算法过程设计.第一题是一个典型的递归问题,通过对开始的几项附初始值,通过循环利用通项公式依次递归调用公式便可以得到第n项的值。

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

重庆大学项目报告项目题目:跳桩得珠宝问题学院:专业班级:计科年级:2011级姓名:学号:完成时间:2013 年 6 月7 日指导教师:陈波重庆大学教务处制项目报告正文一.问题描述有m排n列的柱桩,每一排的柱桩从左向右标号为1,2,…,n,且在每个柱桩上预先放好价值不一样的宝石。

现在有位杂技演员从第一排的第1号柱桩开始跳跃,每次都必须跳到下一排的柱桩上,且每次跳跃最多只能向左或向右移动一个桩子。

也就是说如果现在杂技演员站在第j号桩上,那么他可跳到下一排的第j号桩上,也可跳到下一排的第j-1 (if j>1)或者j+1 (if j<n) 号桩上,并得到桩上的宝石。

计算出一条最佳的跳跃顺序,使杂技演员获得的宝石的总价值最大。

二.算法思想问题抽象:对于这个问题,可以抽象为:从顶部出发,在每一结点可以选择向左走,向下走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。

问题分析:这道题如果用枚举法,在数塔层数稍大的情况下(如40),则需要列举出的路径条数将是一个非常庞大的数目。

如果用贪心法又往往得不到最优解。

在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算。

于是在确定使用动态规划的情况下,对该问题进行分析。

算法思想:从顶点出发时到底向左走,向下走还是向右走应取决于是从哪个方向走能取到最大值,只要左中右三道路径上的最大值求出来了才能作出决策。

同样的道理下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。

这样一层一层推下去,直到倒数第二层时就非常明了。

所以实际求解时,可从底层开始,层层递进,最后得到最大值。

首先,我可以确定,对于矩阵可以用一个二维数组dp储存它,并且可以用(i,j)描述一个数字在矩阵中的位置。

对于中间的一个点来说,想经过它则必须经过它的上方或左上或右上,也就是说经过这个点的数字和最大等于经过上方或左上方或右上方的所得的“最大和”中一个更大的加上这个点中的数字。

显然这个定义满足最优子结构。

三.递推方程式设计一个二维状态opt[i,j]表示走到第i行第j列时经过的数字的最大和。

决策是opt[i-1,j] 或opt[i-1,j-1]或opt[i-1,j+1]中一个更大的加上(i,j)点的数字。

对于一个点只考虑上面或左上或右上即前一阶段,满足无后效性。

状态转移方程(顺推):opt[i-1,j]+dp[i,j] (j=1)opt[i,j]= opt[i-1,j-1]+ dp[i,j] (j=max)max{opt[i-1,j],opt[i-1,j-1]}+ dp[i,j] (1<j<max)实现时可以将opt[i,j]的左右边界定义的大点,初始opt[i,j]=0,由于在j=1时opt[i-1,j-1]=0,opt[i-1,j]>=0所以方程也可以这样写:opt[i,j]=max{opt[i-1,j],max(opt[i-1,j-1],opt[i-1,j+1])}+a[i,j]同理j=i时方程也可以写成上面那样,所以方程综合为:opt[i,j]=max{opt[i-1,j],max(opt[i-1,j-1],opt[i-1,j+1])}+a[i,j] (1<j<max)显然答案是走到底后的一个最大值,即:ans=max{opt[n,i]} (1<=i<=n)其实从上往下走和从下往上走结果是一样的,但是如果从下往上走结果就是opt[1,1]省下求最大值了,所以方程进一步改动(逆推):opt[i,j]=max{opt[i+1,j],max(opt[i-1,j-1],opt[i-1,j+1])}+a[i,j](0<j<=i)四.最优子结构性质对于中间的一个点来说,想经过它则必须经过它的上方或左上或右上,也就是说经过这个点的数字和最大等于经过上方或左上方或右上方的所得的“最大和”中一个更大的加上这个点中的数字。

显然这个定义满足最优子结构。

以此为递推关系。

五.程序结构的描述此程序主要分为以下四个部分文件读入(从文件中读取矩阵的值应存入二维数组中)最大值计算(用递推式推出)明确路径(用一个path数组记录下动态)在文件中显示(读入文件)最大值的计算主要用上述递推式,路径的求得是定义了一个二维数组path,用这个二维数组存取dp中相对应位置的路线动态,比如说在(i,j)点在接下来一行要向右,我们就将path[i][j]赋值为1,则循环时用i++;j+=path[i][j],就将位置右移一个,同理可令向左为-1,向下为0.for(int i = 0, j = 0; i<M; ++i){file2<< "[" << i+1<< "," << j+1 << "]" << " -> ";j += path[i][j];}六.计算复杂度分析此实验中,作为基本操作的原操作是max();即比较函数,在循环中,进行了N^2次,而比较函数其运行时间为常数O(1),故计算最大值部分T(n)=O(n^2);同理,在路径输出部分,关键代码是j+=path[i][j];其T(n)=O(n);该算法总的时间复杂度T(n)=O(n^2)。

七.测试结果: test.txt文件:柱桩20排20列:柱桩4排4列:全部代码:#include <iostream>#include <algorithm>#include <fstream>using namespace std;int const MAX =20;int M,N,num=0;int main(){int count=0;fstream file1,file2;file1.open("test.txt",ios::in);if(!file1)cout<<"input file not founded"<<endl;cout<<" **************跳桩得珠宝****************"<<endl;cout<<" *************1柱桩20排20列**************"<<endl;cout<<" *************2自定义柱桩排列************"<<endl;cout<<"请输入您的选择:";cin>>num;if(num==2){cout<<"请输入排与列(排与列均小于20):"<<endl;cin>>M>>N;}else{if(num==1)M=N=MAX;elsecout<<"输入不符,重新启动!";}int dp[MAX][MAX] = {0};int path[MAX][MAX] = {MAX};//描写路径的坐标 while(!file1.eof())//是否到文件结尾{for(int i=0;i<M;i++)for(int j=0;j<N;j++){file1>>dp[i][j];count++;}if(count==M*N)break;}file2.open("output.txt",ios::out);if(!file2)cout<<"output file not founded"<<endl;for(int i=0;i<M;i++){for(int j=0;j<N;j++){file2<<dp[i][j];file2<<",";}file2<<"\n";}file1.close();for(int i=M - 2; i>=0; i--){for(int j=0; j<=N-1; j++){if(j==0){dp[i][j] = max(dp[i + 1][j],dp[i+1][j+1]) + dp[i][j];if (dp[i+1][j] > dp[i+1][j+1]) //正下方大path[i][j] = 0; //选择正下方else //右边大path[i][j] =1; //选择右边}else{dp[i][j] = max(dp[i + 1][j-1], max(dp[i + 1][j],dp[i+1][j+1])) + dp[i][j];if((dp[i+1][j-1] >=dp[i+1][j])&&(dp[i+1][j-1] >=dp[i+1][j+1])) path[i][j] = -1;elseif((dp[i+1][j] > dp[i+1][j-1])&&(dp[i+1][j] >=dp[i+1][j+1])) //正下方大path[i][j] = 0; //选择正下方else //右边大path[i][j] = 1; //选择右边}}}file2<<dp[0][0]<<" (最大价值)"<< endl;for(int i = 0, j = 0; i<M; ++i){file2<<j+1 <<endl;j += path[i][j];}return EXIT_SUCCESS;}参考资料:Algorithm Design, Jon Kleiberg. Eva Tardos, Cornell University。

相关文档
最新文档