算法分析大作业动态规划方法解乘法表问题和汽车加油行驶问题#精选.
算法实训-汽车加油问题
一、问题定义【问题描述】一辆汽车加满油后可行驶n公里。
旅途中有若干个加油站。
设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。
【输入输出及示例】输入:第一行有2个正整数n和k(k<=1000),表示汽车加满油后可行驶n公里,且旅途中有k个加油站。
第二行有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。
第0个加油站表示出发地,汽车已加满油。
第k+1个加油站表示目的地;输出:如果可以到达目的地则输出最少加油次数,及在第多少个加油站加油。
如果无法到达目的地,则输出“NoSolution!”示例:输入:请输入汽车加满油后可行驶公里数及加油站数: 9 7请依次输入加油站间距离:1 2 3 4 5 1 6 6输出:最少加油次数:3次分别在以下加油站加油:第3个, 第5个, 第7个,二、问题分析1.关于输入距离的说明:关于格式的说明,k个加油站,加上起点和终点,共计k+2个停靠点,有k+1个区间(距离),故第k个距离表示第k个加油站与第k-1个加油站之间的距离,如第一个输入距离则为起点与第一个加油站的距离,最后一个距离,则为最后一个加油站与终点的距离,依次类推;如:请输入汽车加满油后可行驶公里数及加油站数: 9 7请依次输入加油站间距离:1 2 3 4 5 1 6 62.求解过程:输入每个加油站之间的距离,然后某两个加油站之间的距离与汽车油箱最大行驶距离进行比较:(1)如果某两个加油站之间的距离大于汽车油箱最大行驶距离,则汽车不可到达目的地。
即:a[i]>n则输出:“NoSolution!”,结束程序,汽车无论如何不能到达目的地;(2)如果某两个加油站之间的距离小于等于汽车油箱最大行驶距离,距离下一个加油站距离大于汽车油箱最大行驶距离,则在此加油站停车,满足贪心选择性质。
使用贪心策略:对当前待行驶的第i段路程(距离),如果不能行驶(距离大于汽车剩余行驶距离),则加满油行驶,如仍然不能正常行驶(即区间距离大于最大行驶距离),宣告失败;否则,加油计数器更新,行驶过第i段;对下一段同样处理。
东北石油大学算法例题
◎【跳台阶问题】一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少种跳法,并分析算法的时间复杂度。
●对于N级台阶,如果第一跳只跳一级,那么还剩下N-1级,如果第一跳只跳两级,那么还剩下N-2级,由此不难得出对于N级的台阶,总的跳法数相当于N-1级与N-2级的跳法数量之和。
当k排在第n位时,除了n和k以外还有n-2个数,其错排数为Dn-2。
当k不排在第n位时,那么将第n位重新考虑成一个新的“第k位”,这时的包括k在内的剩下n-1个数的每一种错排,都等价于只有n-1个数时的错排(只是其中的第k位会换成第n位)。其错排数为Dn-1。所以当n排在第k位时共有Dn-2+Dn-1种错排方法,又k有从1到n-1共n-1种取法,我们可以得到:Dn=(n-1)(Dn-1+Dn-2)。
设n个矩阵的括号化方案的种数为f(n),那么问题的解为
f(n) = f(1)*f(n-1) + f(2)*f(n-2) + f(3)*f(n-3) + f(n-1)*f(1)。f(1)*f(n-1)表示分成(a1)×(a2×a3.....×an)两部分,然后分别括号化。
计算开始几项,f(1) = 1, f(2) = 1, f(3) = 2, f(4) = 5。结合递归式,不难发现f(n)等于h(n-1)。
}
return an;
}
◎【瓷砖覆盖地板】用1*2的瓷砖覆盖2 * m的地板有几种方式?
f(1) = 1;
f(2) = 2;
f(m) = f(m-1) + f(m-2); (m > 2)
◎【买票找零问题】2n个人排队买票,其中n个人持50元,n个人持100元。每张票50元,且一人只买一张票。初始时售票处没有零钱找零。请问这2n个人一共有多少种排队顺序,不至于使售票处找不开钱?
贪心算法-汽车加油问题
int greedy(vector<int>x, int n) { int sum=0;k=x.size(); for(int i=0;i<k;i++) { if(x[i]>n) return -1; } for(int i=0,s=0;i<k;i++) { s+=x[i]; if(s>n) { sum++; s=x[i]; } } return sum; } sum=4;
●问题描述 一辆汽车加满油之后可以行驶n KM ,旅途中有若干个加油站,设 计一个算法指出在哪些加油站停靠加油可以是沿途加油次数最少。 (给定n和k个加油站位置)
7 7 12345166●问题分析 起点 2 3 4 5 1 6 6 终点
假设X[i]表示i-1到i号加油站之间的距离,每一次都是加 满油再出发,根据贪心算法的选择性质为了要使加油次数最少就会 选择离加满油的点远一点的加油站加油。另外当加满油之后,都要 是此后的过程中使加油次数最少,同样,在第二次加满油之后也要 使此后的加油次数最少。每一次汽车中剩下的油不能再行驶到下一 站就在该站加油,每一次加满油之后与起点具有相同的条件,过程 也是相同的。所以说加油次数最少也具有最优子结构的性质。 贪心策略:最远加油站优先。 第一次遍历,主要是看X[i]是否大于n,若大于n是到达不了重点的,错 误。 第二次遍历,给定s表示加满油之后行驶的距离,如果s>n,说明需要加油, 加油次数sum++,s=x[i]。
Thank you !
贪心算法——汽车加油问题
贪心算法基本思想:
贪心算法总是做出在当前看来是最好的选择,并不会从总体去最优考 虑。虽然贪心算法不会对所有问题找到最优,但是有时候会得到最优 解的近似解。
《算法分析与设计》汽车加油问题
汽车加油问题1. 问题描述一辆汽车加油满后可行驶n千米,旅途中有若干加油站(不包含汽车的出发点)。
假如在出发时已加满油,设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少,并给出加油的地点。
证明算法能产生一个最优解。
算法设计:对于给定的n和k个加油站位置,计算最少加油次数。
2. 算法流程分析设汽车加满油后可行驶n千米,且除了出发点和目的地,旅途中有k个加油站。
把目的地假设为最后一个加油站,有k个加油站。
令数组x存储加油站间距,x[i]表示第i-1个加油站到第i 个加油站之间的距离。
x[0]即出发地到0号加油站的距离。
x[k-1]是第k-2个加油站到第k-1个加油站即终点的距离。
判断s加上x[i]后是否超出n,若超出则必定在i-1处加了油a[i-1]=true ,sum加1表示加油次数加一,且加油后里程从0开始计算,从i-1到达到i处里程为x[i]。
i++进入下一轮,即判断下一个加油站是否能到达。
3. 算法正确性证明通过几组实例证明合法的输入可以得到正确的输出。
实例见附录第2部分。
4. 算法复杂度分析O(n)5.参考文献[1] 王晓东编著,计算机算法设计与分析(第4版)。
北京:电子工业出版社,2012.26.附录(1)可执行代码如下:#include<iostream>using namespace std;int main(){int j,n,k,x[10],c=0,m=0;bool a[10];cout<<"请输入汽车加满油后可行驶的距离(km): ";cin>>n;cout<<"请输入旅途中所经过的加油站个数:";cin>>k;cout<<"请输入每两个相邻加油站之间的距离:"<<endl;for(int i=0;i<=k;i++)cin>>x[i];for(i=0;i<=k;i++)a[i]=false;for(j=0;j<=k;j++){m+=x[j];if(m+x[j+1]>=7){a[j+1]=true;m=0;}}cout<<"在第";for(int s=0;s<=k;s++)if(a[s]==true){c++;cout<<s<<" ";}cout<<"个加油站加油了。
1《算法设计与分析》期末大作业题目
综合题目:(1) 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。
可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。
(2)动态规划法给定N个整数(可能有负数)组成的序列(a1,a2,···an),求该序列形如的字段和的最大值,当所有整数都为负数时,其最大字段和为0。
.(3) 贪心算法一辆汽车加满油后可以行驶N千米。
旅途中有若干个加油站。
若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。
并证明你的算法能产生一个最优解。
实验提示把两加油站的距离放在数组中,a[1..n]表示从起始位置开始跑,经过n个加油站,a[k]表示第k-1个加油站到第k个加油站的距离。
汽车在运行的过程中如果能跑到下一个站则不加油,否则要加油。
(4)回溯法下图是由14个“+”和14个“-”组成的符号三角形。
2个同号下面都是“+”,2个异号下面都是“-”。
+ + - + - + ++ - - - - +- + + + -- + + -- + -- -+在一般情况下,符号三角形的第一行有n个符号。
符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。
(5) 旅行商售货员问题的分支限界算法某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。
他要选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小。
(6) 使用回溯法编程,求解跳马问题实验内容问题描述:在N*N棋盘上有N2个格子,马在初始位置(X0,Y0),按照象棋中马走“日”的规则,使马走遍全部格子且每个格子仅经过一次。
编程输出马的走法。
给出算法描述。
编程实现,给出N=5,(X0,Y0)=(1,1)时的运行结果。
(7) 连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。
算法 加油问题
加油问题● 问题描述:一个旅行家想驾驶汽车从城市A到城市B(设出发时油箱是空的)。
给定两个城市之间的距离d1、汽车油箱的容量c、每升汽油能行驶的距离d2、沿途油站数n、油站i离出发点的距离d[i]以及该站每升汽油的价格p[i],i=1, 2,…,n。
设d[1]=0<d[2]< …<d[n]。
要花最少的油费从城市A到城市B,在每个加油站应加多少油,最少花费为多少?● 贪心选择策略:每到达一站i,找前面油价更便宜的最近一站j,在控制所加的油量至多只能行驶到站j的前提下,尽可能多加油。
目的:使得在每一段路(两相邻加油站之间)上所花的油费都尽可能少。
● 贪心算法:分析:(1) 设在第i站,汽车油箱剩余油量为r, 前面油价更便宜的最近一站为第j站,从第i站到第j站需油量m1, 则在第i站应加的油量x[i]分下列三种情况计算:1)r>=m1: 在第i站不加油,x[i]=0。
2)r<m1, c>=m1:在第i站加油使车刚好行驶至第j站,x[i]=m1-r。
3)c<m1:在第i站加满油,x[i]=c-r。
(2) 为了使汽车到终点时刚好油用完,在终点设一个虚拟油站n+1, 油价p[n+1]=0。
(3)注意问题可能无解,应判断。
算法CHEAPEST_TRA VEL输入:城市A、B间的距离d1,沿途油站数n,各油站距离出发点的距离数组d[1..n], (d[0]=0), 汽车油箱的容量c, 每升汽油能行驶的距离d2。
输出:从城市A到城市B所花费的最少油费min以及在各油站所加的油量x[1..n]。
若问题无解,则输出No Solution。
d[n+1]=d1; p[n+1]=0 //在终点设一个虚拟油站。
d3=c*d2 //d3为油箱加满油时可行驶的距离。
//检查问题是否有解。
i=1while i<=nif d[i+1]-d[i]>d3 then //无解输出“No Solution”; returnend ifi=i+1end whilemin=0r=0 //出发时油箱为空for i=1 to n//在第i站:j=i+1while p[j]>=p[i] //找站i前面油价更便宜的最近一站j。
算法设计与分析试卷答案
算法设计与分析1、(1) 证明:O(f)+O(g)=O(f+g)(7分)(2) 求下列函数的渐近表达式:(6分)① 3n 2+10n;② 21+1/n;2、对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
(15分)(1);5log )(;log )(2+==n n g n n f (2);)(;log )(2n n g n n f == (3);log )(;)(2n n g n n f == 3、试用分治法对数组A[n]实现快速排序。
(13分)4、试用动态规划算法实现最长公共子序列问题。
(15分)5、试用贪心算法求解汽车加油问题:已知一辆汽车加满油后可行驶n 公里,而旅途中有若干个加油站。
试设计一个有效算法,指出应在哪些加油站停靠加油,使加油次数最少。
(12分)6、试用动态规划算法实现下列问题:设A 和B 是两个字符串。
我们要用最少的字符操作,将字符串A 转换为字符串B ,这里所说的字符操作包括:(1)删除一个字符。
(2)插入一个字符。
(3)将一个字符改为另一个字符。
将字符串A 变换为字符串B 所用的最少字符操作数称为字符串A 到B 的编辑距离,记为d(A,B)。
试设计一个有效算法,对任给的两个字符串A 和B ,计算出它们的编辑距离d(A,B)。
(16分)7、试用回溯法解决下列整数变换问题:关于整数i 的变换f 和g 定义如下:⎣⎦2/)(;3)(i i g i i f ==。
对于给定的两个整数n 和m ,要求用最少的变换f 和g 变换次数将n 变为m 。
(16分)1、⑴证明:令F(n)=O(f),则存在自然数n 1、c 1,使得对任意的自然数n ≥n 1,有:F(n)≤c 1f(n)……………………………..(2分) 同理可令G(n)=O(g),则存在自然数n2、c 2,使得对任意的自然数n ≥n 2,有:G(n)≤c 2g(n)……………………………..(3分)令c 3=max{c 1,c 2},n 3=max{n 1,n 2},则对所有的n ≥n 3,有: F(n)≤c 1f(n)≤c 3f(n)G(n)≤c 2g(n)≤c 3g(n)……………………………..(5分) 故有:O(f)+O(g)=F(n)+G(n)≤c 3f(n)+c 3g(n)=c 3(f(n)+g(n))因此有:O(f)+O(g)=O(f+g)……………………………..(7分)⑵ 解:① 因为;01033)103(lim 222=+-+∞→n n n n n n 由渐近表达式的定义易知:3n 2是3n 2+10n 的渐近表达式。
算法分析大作业动态规划方法解乘法表问题和汽车加油行驶问题#精选.
算法分析⼤作业动态规划⽅法解乘法表问题和汽车加油⾏驶问题#精选.算法分析⼤作业动态规划⽅法解乘法表问题和汽车加油⾏驶问题⽬录1.动态规划解乘法表问题1.1问题描述------1.2算法设计思想------1.3设计⽅法------1.4源代码------1.5最终结果------2.动态规划解汽车加油⾏驶问题2.1问题描述------2.2算法设计思想------2.3设计⽅法------2.4源代码------2.5最终结果------3.总结1.动态规划解决乘法表问题1.1问题描述定义于字母表∑{a,b,c)上的乘法表如表所⽰:依此乘法表,对任⼀定义于∑上的字符串,适当加括号表达式后得到⼀个表达式。
例如,对于字符串x=bbbba,它的⼀个加括号表达式为(b(bb))(ba)。
依乘法表,该表达式的值为a。
试设计⼀个动态规划算法,对任⼀定义于∑上的字符串x=x1x2…xn,计算有多少种不同的加括号⽅式,使由x导出的加括号表达式的值为a。
1.2算法设计思想设常量a,b,c 分别为 1, 2 ,3 。
n 为字符串的长度。
设字符串的第 i 到第 j 位乘积为 a 的加括号法有result[i][j][a] 种,字符串的第 i 到第 j 位乘积为 b 的加括号法有result[i][j][b] 种,字符串的第 i 到第 j 位乘积为 c 的加括号法有 result[i][j][c] 种。
则原问题的解是:result[i][n][a] 。
设 k 为 i 到 j 中的某⼀个字符,则对于 k 从 i 到 j :result[i][j][a] += result[i][k][a] * result[k + 1][j][c] +result[i][k][b] * result[k + 1][j][c] + result[i][k][c] * result[k + 1][j][a];result[i][j][b] += result[i][k][a] * result[k + 1][j][a] +result[i][k][a] * result[k + 1][j][b] + result[i][k][b] * result[k + 1][j][b];result[i][j][c] += result[i][k][b] * result[k + 1][j][a] +result[i][k][c] * result[k + 1][j][b] + result[i][k][c] * result[k + 1][j][c];输⼊:输⼊⼀个以a,b,c组成的任意⼀个字符串。
动态规划算法详解和应用
动态规划算法详解和应用动态规划(Dynamic Programming)算法是从多个阶段中逐步逼近最优解的一种算法。
它的主要思想是将原问题拆分成若干个子问题,并使用已解决的子问题的解来推导还未解决的子问题。
在处理每个子问题时,都会保存之前已经部分解决过的子问题的结果。
借助这些结果来解决更复杂的问题。
动态规划算法因此得名。
本文将详细介绍动态规划算法的基本思想、步骤和应用。
动态规划算法的基本思想:当解决一个问题时,将其分解成若干个子问题并求解。
每个子问题的解只会记录一次,以避免重复求解。
因此,动态规划算法重复使用以前的子问题的解来解决当前的子问题。
在计算机编程中,动态规划通常需要做出一种递归解法,以解决问题的所有可能情况。
如果递归解法的效率太低,可以让它转化为带有动态规划思想的算法,其根据已经解决的子问题计算其它子问题。
动态规划算法的基本步骤:1. 定义状态: 状态是决定某个时刻或某个条件的变量(或变量集合)。
它反映了解决一个问题需要的参数信息。
例如,对于求解最长公共子序列问题来说,状态就是两个字符串的下标。
2. 定义转移:对于当前状态,转移就是从上一状态到达当前状态所要执行的操作(比如以左上角有没有两个字符为例,若匹配则加上当前结果,否则不加)3. 初始化状态:通常在定义状态时,会初始化状态。
在问题开始时,只需要初始化状态就可以得出问题的部分或全部答案。
4. 通常使用一维或多维数组存储状态。
状态也可以是其他容器,如哈希表、树和堆等。
5. 最后得到问题的最终答案。
动态规划算法的应用:1. 寻找最长/最短路径问题(例如:Dijkstra算法和Floyd算法);2. 寻找最优二叉树(例如:Huffman编码算法);3. 求解最大子数列问题(例如:Kadane算法);4. 求解最长公共子序列问题(例如:LCS算法);5. 求解最长回文子串(例如:Manacher算法);6. 求解背包问题(例如:01背包、完全背包)。
算法设计分析试卷(答案)
算法设计与分析1、(1) 证明:O(f)+O(g)=O(f+g)(7分)(2) 求下列函数的渐近表达式:(6分)① 3n 2+10n;② 21+1/n;2、对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
(15分)(1);5log )(;log )(2+==n n g n n f (2);)(;log )(2n n g n n f == (3);log )(;)(2n n g n n f == 3、试用分治法对数组A[n]实现快速排序。
(13分)4、试用动态规划算法实现最长公共子序列问题。
(15分)5、试用贪心算法求解汽车加油问题:已知一辆汽车加满油后可行驶n 公里,而旅途中有若干个加油站。
试设计一个有效算法,指出应在哪些加油站停靠加油,使加油次数最少。
(12分)6、试用动态规划算法实现下列问题:设A 和B 是两个字符串。
我们要用最少的字符操作,将字符串A 转换为字符串B ,这里所说的字符操作包括:(1)删除一个字符。
(2)插入一个字符。
(3)将一个字符改为另一个字符。
将字符串A 变换为字符串B 所用的最少字符操作数称为字符串A 到B 的编辑距离,记为d(A,B)。
试设计一个有效算法,对任给的两个字符串A 和B ,计算出它们的编辑距离d(A,B)。
(16分)7、试用回溯法解决下列整数变换问题:关于整数i 的变换f 和g 定义如下:⎣⎦2/)(;3)(i i g i i f ==。
对于给定的两个整数n 和m ,要求用最少的变换f 和g 变换次数将n 变为m 。
(16分)1、⑴证明:令F(n)=O(f),则存在自然数n 1、c 1,使得对任意的自然数n ≥n 1,有:F(n)≤c 1f(n)……………………………..(2分) 同理可令G(n)=O(g),则存在自然数n2、c 2,使得对任意的自然数n ≥n 2,有:G(n)≤c 2g(n)……………………………..(3分)令c 3=max{c 1,c 2},n 3=max{n 1,n 2},则对所有的n ≥n 3,有:F(n)≤c 1f(n)≤c 3f(n)G(n)≤c 2g(n)≤c 3g(n)……………………………..(5分)故有:O(f)+O(g)=F(n)+G(n)≤c 3f(n)+c 3g(n)=c 3(f(n)+g(n))因此有:O(f)+O(g)=O(f+g)……………………………..(7分)⑵ 解:① 因为;01033)103(lim 222=+-+∞→n n n n n n 由渐近表达式的定义易知:3n 2是3n 2+10n 的渐近表达式。
算法试卷
算法设计与分析课程试题一一、选择题1.选出不是算法所必须具备的特征()。
A有穷性B确切性C高效性D可行性2.下列()不是衡量算法的标准。
A 时间效率B 空间效率C 问题的难度D 适应能力3.与递推关系x(n)=2x(n-1)+1,x(1)=1等价的通项公式为()。
A x(n)=2nB x(n)=2n-1C x(n)=2n+1D x(n)=n!4.二维最近邻点问题,如果使用分治法,对于一个子集上的某一点,另一个子集上需要检查的点的个数是()。
A 1个B 2个C 6个D 8个5.下列是动态规划算法基本要素的是()。
A 最优子结构B构造最优解 C 贪心选择因子D界限函数6.()算法应用到广度优先遍历策略。
A 分支界限法B 动态规划法C分治法D回溯法7.Prim算法求最小生成树采用的是()算法思想。
A 贪心算法B 动态规划法C 回溯法D 蛮力法11.三个盘子的汉诺塔,至8.对于凸集下列说法正确的是()。
A 凸集中的所有点都属于凸包;B 凸集中任意两点的连线都在凸中;C 凸集中任意两点的连线都不在凸集中;D一个点集如果不是凸集,则点集中任意两点的连线都不在凸集中少9.对多段图问题描述不正确的是:;A、多段图是一个无向图B、可用向前处理法;C、可用向后处理法;D、可用分治法解决。
10.以下对回溯法描述正确的是:;A、解必须表示成一个2n-元组(x1,x1,x2,x2,﹒﹒﹒,x n,x n);B、回溯法的解必须满足一组综合的约束条件,称为解函数;C、满足显示约束的所有元组不能确定一个可能的解空间,D、隐式约束描述了元组中元素x i必须彼此相关的情况。
二、填空1.算法区别于程序:。
2.递推公式x(n)=x(n-1)+n,x(0)=0,x(n)= 。
3..按分治策略求解棋盘覆盖问题时,对于如图1所示的23×23的特殊棋盘,共需要____个L型骨牌;并在棋盘上填写L型骨牌的覆盖情况。
+ + - + - +++ - - - - + - + + + -- + + - - + -- - +图1 棋盘覆盖 图2 符号三角形4.对下述五个文件用贪心方法进行最优归并:文件x 1,x 2,x 3,x 4和x 5分别有18,24,8,6和28个记录;则文件移动的最少次数为:。
算法设计与分析习题解答(第2版)
第1章算法引论11.1 算法与程序11.2 表达算法的抽象机制11.3 描述算法31.4 算法复杂性分析13小结16习题17第2章递归与分治策略192.1 递归的概念192.2 分治法的基本思想262.3 二分搜索技术272.4 大整数的乘法282.5 Strassen矩阵乘法302.6 棋盘覆盖322.7 合并排序342.8 快速排序372.9 线性时间选择392.10 最接近点对问题432.11 循环赛日程表53小结54习题54第3章动态规划613.1 矩阵连乘问题62目录算法设计与分析(第2版)3.2 动态规划算法的基本要素67 3.3 最长公共子序列713.4 凸多边形最优三角剖分753.5 多边形游戏793.6 图像压缩823.7 电路布线853.8 流水作业调度883.9 0-1背包问题923.10 最优二叉搜索树98小结101习题102第4章贪心算法1074.1 活动安排问题1074.2 贪心算法的基本要素1104.2.1 贪心选择性质1114.2.2 最优子结构性质1114.2.3 贪心算法与动态规划算法的差异1114.3 最优装载1144.4 哈夫曼编码1164.4.1 前缀码1174.4.2 构造哈夫曼编码1174.4.3 哈夫曼算法的正确性1194.5 单源最短路径1214.5.1 算法基本思想1214.5.2 算法的正确性和计算复杂性123 4.6 最小生成树1254.6.1 最小生成树性质1254.6.2 Prim算法1264.6.3 Kruskal算法1284.7 多机调度问题1304.8 贪心算法的理论基础1334.8.1 拟阵1334.8.2 带权拟阵的贪心算法1344.8.3 任务时间表问题137小结141习题141第5章回溯法1465.1 回溯法的算法框架1465.1.1 问题的解空间1465.1.2 回溯法的基本思想1475.1.3 递归回溯1495.1.4 迭代回溯1505.1.5 子集树与排列树1515.2 装载问题1525.3 批处理作业调度1605.4 符号三角形问题1625.5 n后问题1655.6 0\|1背包问题1685.7 最大团问题1715.8 图的m着色问题1745.9 旅行售货员问题1775.10 圆排列问题1795.11 电路板排列问题1815.12 连续邮资问题1855.13 回溯法的效率分析187小结190习题191第6章分支限界法1956.1 分支限界法的基本思想1956.2 单源最短路径问题1986.3 装载问题2026.4 布线问题2116.5 0\|1背包问题2166.6 最大团问题2226.7 旅行售货员问题2256.8 电路板排列问题2296.9 批处理作业调度232小结237习题238第7章概率算法2407.1 随机数2417.2 数值概率算法2447.2.1 用随机投点法计算π值2447.2.2 计算定积分2457.2.3 解非线性方程组2477.3 舍伍德算法2507.3.1 线性时间选择算法2507.3.2 跳跃表2527.4 拉斯维加斯算法2597.4.1 n 后问题2607.4.2 整数因子分解2647.5 蒙特卡罗算法2667.5.1 蒙特卡罗算法的基本思想2667.5.2 主元素问题2687.5.3 素数测试270小结273习题273第8章 NP完全性理论2788.1 计算模型2798.1.1 随机存取机RAM2798.1.2 随机存取存储程序机RASP2878.1.3 RAM模型的变形与简化2918.1.4 图灵机2958.1.5 图灵机模型与RAM模型的关系297 8.1.6 问题变换与计算复杂性归约299 8.2 P类与NP类问题3018.2.1 非确定性图灵机3018.2.2 P类与NP类语言3028.2.3 多项式时间验证3048.3 NP完全问题3058.3.1 多项式时间变换3058.3.2 Cook定理3078.4 一些典型的NP完全问题3108.4.1 合取范式的可满足性问题3118.4.2 3元合取范式的可满足性问题312 8.4.3 团问题3138.4.4 顶点覆盖问题3148.4.5 子集和问题3158.4.6 哈密顿回路问题3178.4.7 旅行售货员问题322小结323习题323第9章近似算法3269.1 近似算法的性能3279.2 顶点覆盖问题的近似算法3289.3 旅行售货员问题近似算法3299.3.1 具有三角不等式性质的旅行售货员问题330 9.3.2 一般的旅行售货员问题3319.4 集合覆盖问题的近似算法3339.5 子集和问题的近似算法3369.5.1 子集和问题的指数时间算法3369.5.2 子集和问题的完全多项式时间近似格式337 小结340习题340第10章算法优化策略34510.1 算法设计策略的比较与选择34510.1.1 最大子段和问题的简单算法34510.1.2 最大子段和问题的分治算法34610.1.3 最大子段和问题的动态规划算法34810.1.4 最大子段和问题与动态规划算法的推广349 10.2 动态规划加速原理35210.2.1 货物储运问题35210.2.2 算法及其优化35310.3 问题的算法特征35710.3.1 贪心策略35710.3.2 对贪心策略的改进35710.3.3 算法三部曲35910.3.4 算法实现36010.3.5 算法复杂性36610.4 优化数据结构36610.4.1 带权区间最短路问题36610.4.2 算法设计思想36710.4.3 算法实现方案36910.4.4 并查集37310.4.5 可并优先队列37610.5 优化搜索策略380小结388习题388第11章在线算法设计39111.1 在线算法设计的基本概念39111.2 页调度问题39311.3 势函数分析39511.4 k 服务问题39711.4.1 竞争比的下界39711.4.2 平衡算法39911.4.3 对称移动算法39911.5 Steiner树问题40311.6 在线任务调度40511.7 负载平衡406小结407习题407词汇索引409参考文献415习题1-1 实参交换1习题1-2 方法头签名1习题1-3 数组排序判定1习题1-4 函数的渐近表达式2习题1-5 O(1) 和 O(2) 的区别2习题1-7 按渐近阶排列表达式2习题1-8 算法效率2习题1-9 硬件效率3习题1-10 函数渐近阶3习题1-11 n !的阶4习题1-12 平均情况下的计算时间复杂性4算法实现题1-1 统计数字问题4算法实现题1-2 字典序问题5算法实现题1-3 最多约数问题6算法实现题1-4 金币阵列问题8算法实现题1-5 最大间隙问题11第2章递归与分治策略14 习题2-1 Hanoi 塔问题的非递归算法14习题2-2 7个二分搜索算法15习题2-3 改写二分搜索算法18习题2-4 大整数乘法的 O(nm log(3/2))算法19习题2-5 5次 n /3位整数的乘法19习题2-6 矩阵乘法21习题2-7 多项式乘积21习题2-8 不动点问题的 O( log n) 时间算法22习题2-9 主元素问题的线性时间算法22习题2-10 无序集主元素问题的线性时间算法22习题2-11 O (1)空间子数组换位算法23习题2-12 O (1)空间合并算法25习题2-13 n 段合并排序算法32习题2-14 自然合并排序算法32习题2-15 最大值和最小值问题的最优算法35习题2-16 最大值和次大值问题的最优算法35习题2-17 整数集合排序35习题2-18 第 k 小元素问题的计算时间下界36习题2-19 非增序快速排序算法37习题2-20 随机化算法37习题2-21 随机化快速排序算法38习题2-22 随机排列算法38习题2-23 算法qSort中的尾递归38习题2-24 用栈模拟递归38习题2-25 算法select中的元素划分39习题2-26 O(n log n) 时间快速排序算法40习题2-27 最接近中位数的 k 个数40习题2-28 X和Y 的中位数40习题2-29 网络开关设计41习题2-32 带权中位数问题42习题2-34 构造Gray码的分治算法43习题2-35 网球循环赛日程表44目录算法设计与分析习题解答(第2版)算法实现题2-1 输油管道问题(习题2-30) 49算法实现题2-2 众数问题(习题2-31) 50算法实现题2-3 邮局选址问题(习题2-32) 51算法实现题2-4 马的Hamilton周游路线问题(习题2-33) 51算法实现题2-5 半数集问题60算法实现题2-6 半数单集问题62算法实现题2-7 士兵站队问题63算法实现题2-8 有重复元素的排列问题63算法实现题2-9 排列的字典序问题65算法实现题2-10 集合划分问题(一)67算法实现题2-11 集合划分问题(二)68算法实现题2-12 双色Hanoi塔问题69算法实现题2-13 标准二维表问题71算法实现题2-14 整数因子分解问题72算法实现题2-15 有向直线2中值问题72第3章动态规划76习题3-1 最长单调递增子序列76习题3-2 最长单调递增子序列的 O(n log n) 算法77习题3-7 漂亮打印78习题3-11 整数线性规划问题79习题3-12 二维背包问题80习题3-14 Ackermann函数81习题3-17 最短行驶路线83习题3-19 最优旅行路线83算法实现题3-1 独立任务最优调度问题(习题3-3) 83算法实现题3-2 最少硬币问题(习题3-4) 85算法实现题3-3 序关系计数问题(习题3-5) 86算法实现题3-4 多重幂计数问题(习题3-6) 87算法实现题3-5 编辑距离问题(习题3-8) 87算法实现题3-6 石子合并问题(习题3-9) 89算法实现题3-7 数字三角形问题(习题3-10) 91算法实现题3-8 乘法表问题(习题3-13) 92算法实现题3-9 租用游艇问题(习题3-15) 93算法实现题3-10 汽车加油行驶问题(习题3-16) 95算法实现题3-11 圈乘运算问题(习题3-18) 96算法实现题3-12 最少费用购物(习题3-20) 102算法实现题3-13 最大长方体问题(习题3-21) 104算法实现题3-14 正则表达式匹配问题(习题3-22) 105算法实现题3-15 双调旅行售货员问题(习题3-23) 110算法实现题3-16 最大 k 乘积问题(习题5-24) 111算法实现题3-17 最小 m 段和问题113算法实现题3-18 红黑树的红色内结点问题115第4章贪心算法123 习题4-2 活动安排问题的贪心选择123习题4-3 背包问题的贪心选择性质123习题4-4 特殊的0-1背包问题124习题4-10 程序最优存储问题124习题4-13 最优装载问题的贪心算法125习题4-18 Fibonacci序列的Huffman编码125习题4-19 最优前缀码的编码序列125习题4-21 任务集独立性问题126习题4-22 矩阵拟阵126习题4-23 最小权最大独立子集拟阵126习题4-27 整数边权Prim算法126习题4-28 最大权最小生成树127习题4-29 最短路径的负边权127习题4-30 整数边权Dijkstra算法127算法实现题4-1 会场安排问题(习题4-1) 128算法实现题4-2 最优合并问题(习题4-5) 129算法实现题4-3 磁带最优存储问题(习题4-6) 130算法实现题4-4 磁盘文件最优存储问题(习题4-7) 131算法实现题4-5 程序存储问题(习题4-8) 132算法实现题4-6 最优服务次序问题(习题4-11) 133算法实现题4-7 多处最优服务次序问题(习题4-12) 134算法实现题4-8 d 森林问题(习题4-14) 135算法实现题4-9 汽车加油问题(习题4-16) 137算法实现题4-10 区间覆盖问题(习题4-17) 138算法实现题4-11 硬币找钱问题(习题4-24) 138算法实现题4-12 删数问题(习题4-25) 139算法实现题4-13 数列极差问题(习题4-26) 140算法实现题4-14 嵌套箱问题(习题4-31) 140算法实现题4-15 套汇问题(习题4-32) 142算法实现题4-16 信号增强装置问题(习题5-17) 143算法实现题4-17 磁带最大利用率问题(习题4-9) 144算法实现题4-18 非单位时间任务安排问题(习题4-15) 145算法实现题4-19 多元Huffman编码问题(习题4-20) 147算法实现题4-20 多元Huffman编码变形149算法实现题4-21 区间相交问题151算法实现题4-22 任务时间表问题151第5章回溯法153习题5\|1 装载问题改进回溯法(一)153习题5\|2 装载问题改进回溯法(二)154习题5\|4 0-1背包问题的最优解155习题5\|5 最大团问题的迭代回溯法156习题5\|7 旅行售货员问题的费用上界157习题5\|8 旅行售货员问题的上界函数158算法实现题5-1 子集和问题(习题5-3) 159算法实现题5-2 最小长度电路板排列问题(习题5-9) 160算法实现题5-3 最小重量机器设计问题(习题5-10) 163算法实现题5-4 运动员最佳匹配问题(习题5-11) 164算法实现题5-5 无分隔符字典问题(习题5-12) 165算法实现题5-6 无和集问题(习题5-13) 167算法实现题5-7 n 色方柱问题(习题5-14) 168算法实现题5-8 整数变换问题(习题5-15) 173算法实现题5-9 拉丁矩阵问题(习题5-16) 175算法实现题5-10 排列宝石问题(习题5-16) 176算法实现题5-11 重复拉丁矩阵问题(习题5-16) 179算法实现题5-12 罗密欧与朱丽叶的迷宫问题181算法实现题5-13 工作分配问题(习题5-18) 183算法实现题5-14 独立钻石跳棋问题(习题5-19) 184算法实现题5-15 智力拼图问题(习题5-20) 191算法实现题5-16 布线问题(习题5-21) 198算法实现题5-17 最佳调度问题(习题5-22) 200算法实现题5-18 无优先级运算问题(习题5-23) 201算法实现题5-19 世界名画陈列馆问题(习题5-25) 203算法实现题5-20 世界名画陈列馆问题(不重复监视)(习题5-26) 207 算法实现题5-21 部落卫队问题(习题5-6) 209算法实现题5-22 虫蚀算式问题211算法实现题5-23 完备环序列问题214算法实现题5-24 离散01串问题217算法实现题5-25 喷漆机器人问题218算法实现题5-26 n 2-1谜问题221第6章分支限界法229习题6-1 0-1背包问题的栈式分支限界法229习题6-2 用最大堆存储活结点的优先队列式分支限界法231习题6-3 团顶点数的上界234习题6-4 团顶点数改进的上界235习题6-5 修改解旅行售货员问题的分支限界法235习题6-6 解旅行售货员问题的分支限界法中保存已产生的排列树237 习题6-7 电路板排列问题的队列式分支限界法239算法实现题6-1 最小长度电路板排列问题一(习题6-8) 241算法实现题6-2 最小长度电路板排列问题二(习题6-9) 244算法实现题6-3 最小权顶点覆盖问题(习题6-10) 247算法实现题6-4 无向图的最大割问题(习题6-11) 250算法实现题6-5 最小重量机器设计问题(习题6-12) 253算法实现题6-6 运动员最佳匹配问题(习题6-13) 256算法实现题6-7 n 后问题(习题6-15) 259算法实现题6-8 圆排列问题(习题6-16) 260算法实现题6-9 布线问题(习题6-17) 263算法实现题6-10 最佳调度问题(习题6-18) 265算法实现题6-11 无优先级运算问题(习题6-19) 268算法实现题6-12 世界名画陈列馆问题(习题6-21) 271算法实现题6-13 骑士征途问题274算法实现题6-14 推箱子问题275算法实现题6-15 图形变换问题281算法实现题6-16 行列变换问题284算法实现题6-17 重排 n 2宫问题285算法实现题6-18 最长距离问题290第7章概率算法296习题7-1 模拟正态分布随机变量296习题7-2 随机抽样算法297习题7-3 随机产生 m 个整数297习题7-4 集合大小的概率算法298习题7-5 生日问题299习题7-6 易验证问题的拉斯维加斯算法300习题7-7 用数组模拟有序链表300习题7-8 O(n 3/2)舍伍德型排序算法300习题7-9 n 后问题解的存在性301习题7-11 整数因子分解算法302习题7-12 非蒙特卡罗算法的例子302习题7-13 重复3次的蒙特卡罗算法303习题7-14 集合随机元素算法304习题7-15 由蒙特卡罗算法构造拉斯维加斯算法305习题7-16 产生素数算法306习题7-18 矩阵方程问题306算法实现题7-1 模平方根问题(习题7-10) 307算法实现题7-2 集合相等问题(习题7-17) 309算法实现题7-3 逆矩阵问题(习题7-19) 309算法实现题7-4 多项式乘积问题(习题7-20) 310算法实现题7-5 皇后控制问题311算法实现题7-6 3-SAT问题314算法实现题7-7 战车问题315算法实现题7-8 圆排列问题317算法实现题7-9 骑士控制问题319算法实现题7-10 骑士对攻问题320第8章NP完全性理论322 习题8-1 RAM和RASP程序322习题8-2 RAM和RASP程序的复杂性322习题8-3 计算 n n 的RAM程序322习题8-4 没有MULT和DIV指令的RAM程序324习题8-5 MULT和DIV指令的计算能力324习题8-6 RAM和RASP的空间复杂性325习题8-7 行列式的直线式程序325习题8-8 求和的3带图灵机325习题8-9 模拟RAM指令325习题8-10 计算2 2 n 的RAM程序325习题8-11 计算 g(m,n)的程序 326习题8-12 图灵机模拟RAM的时间上界326习题8-13 图的同构问题326习题8-14 哈密顿回路327习题8-15 P类语言的封闭性327习题8-16 NP类语言的封闭性328习题8-17 语言的2 O (n k) 时间判定算法328习题8-18 P CO -NP329习题8-19 NP≠CO -NP329习题8-20 重言布尔表达式329习题8-21 关系∝ p的传递性329习题8-22 L ∝ p 330习题8-23 语言的完全性330习题8-24 的CO-NP完全性330习题8-25 判定重言式的CO-NP完全性331习题8-26 析取范式的可满足性331习题8-27 2-SAT问题的线性时间算法331习题8-28 整数规划问题332习题8-29 划分问题333习题8-30 最长简单回路问题334第9章近似算法336习题9-1 平面图着色问题的绝对近似算法336习题9-2 最优程序存储问题336习题9-4 树的最优顶点覆盖337习题9-5 顶点覆盖算法的性能比339习题9-6 团的常数性能比近似算法339习题9-9 售货员问题的常数性能比近似算法340习题9-10 瓶颈旅行售货员问题340习题9-11 最优旅行售货员回路不自相交342习题9-14 集合覆盖问题的实例342习题9-16 多机调度问题的近似算法343习题9-17 LPT算法的最坏情况实例345习题9-18 多机调度问题的多项式时间近似算法345算法实现题9-1 旅行售货员问题的近似算法(习题9-9) 346 算法实现题9-2 可满足问题的近似算法(习题9-20) 348算法实现题9-3 最大可满足问题的近似算法(习题9-21) 349 算法实现题9-4 子集和问题的近似算法(习题9-15) 351算法实现题9-5 子集和问题的完全多项式时间近似算法352算法实现题9-6 实现算法greedySetCover(习题9-13) 352算法实现题9-7 装箱问题的近似算法First Fit(习题9-19) 356算法实现题9-8 装箱问题的近似算法Best Fit(习题9-19) 358算法实现题9-9 装箱问题的近似算法First Fit Decreasing(习题9-19) 360算法实现题9-10 装箱问题的近似算法Best Fit Decreasing(习题9-19) 361算法实现题9-11 装箱问题的近似算法Next Fit361第10章算法优化策略365 习题10-1 算法obst的正确性365习题10-2 矩阵连乘问题的 O(n 2) 时间算法365习题10-6 货物储运问题的费用371习题10-7 Garsia算法371算法实现题10-1 货物储运问题(习题10-3) 374算法实现题10-2 石子合并问题(习题10-4) 374算法实现题10-3 最大运输费用货物储运问题(习题10-5) 375算法实现题10-4 五边形问题377算法实现题10-5 区间图最短路问题(习题10-8) 381算法实现题10-6 圆弧区间最短路问题(习题10-9) 381算法实现题10-7 双机调度问题(习题10-10) 382算法实现题10-8 离线最小值问题(习题10-11) 390算法实现题10-9 最近公共祖先问题(习题10-12) 393算法实现题10-10 达尔文芯片问题395算法实现题10-11 多柱Hanoi塔问题397算法实现题10-12 线性时间Huffman算法400算法实现题10-13 单机调度问题402算法实现题10-14 最大费用单机调度问题405算法实现题10-15 飞机加油问题408第11章在线算法设计410习题11-1 在线算法LFU的竞争性410习题11-4 多读写头磁盘问题的在线算法410习题11-6 带权页调度问题410算法实现题11-1 最优页调度问题(习题11-2) 411算法实现题11-2 在线LRU页调度(习题11-3) 414算法实现题11-3 k 服务问题(习题11-5) 416参考文献422。
题目汽车加油问题
题目汽车加油问题论文提要一辆汽车加满油后可行驶n公里,旅途中有若干个加油站,设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少,对于给定的n和k个加油站位置,编程计算最少加油次数。
可以利用贪心选择性质来求解汽车加油问题,也就是所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
这是贪心选择算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
在动态规划算法中,每步所做的选择往往信赖于相关子问题的解,因而只有在解出相关子问题后,才能做出选择。
而在贪心算法中仅在当前状态下做出最好选择,即局部最优选择,然后再去解出这个选择后产生的相应的子问题,贪心算法所做的贪心选择可以依赖于以往所做过的选择,但决不依赖于将来所做的选择,也不依赖于子问题的解。
关于汽车加油问题摘要:汽车行驶过程中,应走到自己能走到并且离自己最远的那个加油站,在那个加油站加油后再按照同样的方法,其中保持车子每次加油都能够行驶最远距离。
当然有可能是达到不了终点的情况,也就是存在某两个加油站之间的距离大于每次加油能够行驶的最远距离,首先检测各加油站之间的距离,若发现其中有一个距离大于汽车加满油能跑的距离,则输出“No Solution”。
否则,对加油站间的距离进行逐个扫描,尽量选择往远处走,不能走了就让num++,最终统计出来的num便是最少的加油站数。
关键词:汽车加油贪心性质最优化问题一、汽车加油问题描述一辆汽车加满油后可行驶n公里,旅途中有若干个加油站,设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。
对于给定的n和k个加油站位置,编程计算最少加油次数。
并证明算法能产生一个最优解。
输入:第一行有个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。
接下来的行驶中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。
第k个加油站表示出发地,汽车已加满油。
第k+1 个加油站表示目的地。
动态车辆规划问题的求解算法研究
动态车辆规划问题的求解算法研究一、绪论动态车辆规划问题是指在不同的时间和空间条件下,对于汽车、火车、飞机等车辆的最优路径规划和调度问题。
解决这一问题对于交通、物流等行业具有重要意义,因此动态车辆规划问题的求解算法研究受到了广泛关注。
本文将对动态车辆规划问题的求解算法进行研究分析。
二、动态车辆规划问题的形式化描述动态车辆规划问题可以表示为一个集合 $(V,E,W)$ 的图,其中$V$ 表示节点的集合,$E$ 表示边的集合,$W$ 表示边的权重集合。
对于每一个时间点 $t$,车辆需要从起点 $s$ 出发,在时间$t$ 到达目标点 $t_i$,其中车辆每时每刻的状态都会发生变化,包括速度、行驶方向、位置等等。
因此,动态车辆规划问题的求解算法需要考虑这些变化,并给出最优的路径规划方案。
三、动态车辆规划问题的求解算法研究1. 基于离线规划的动态车辆规划算法该算法是指在车辆还没有出发之前,基于历史数据进行路径规划。
具体来说,通过统计历史记录的路况变化、拥堵情况等信息,制定出最佳的路径方案。
由于该算法不需要实时监控车辆的状态,因此在计算效率上有一定优势。
但是,在实际运用中,道路和交通状况的变化和不确定性会影响该算法的精度。
2. 基于在线规划的动态车辆规划算法该算法是指在车辆运行过程中,实时监控车辆的状态和路况信息,并根据这些信息制定路径规划方案。
由于该算法可以及时反馈路况变化,能够更精确地进行路径规划和调度。
但由于需要实时监控车辆状态和路况信息,因此计算效率较低。
3. 基于混合规划的动态车辆规划算法该算法是指将离线规划和在线规划相结合,既考虑历史数据,也考虑实时监控。
具体来说,该算法在车辆出发时根据历史数据进行初步规划,然后在运行过程中实时监控路况信息,对规划路径进行修正。
该算法兼顾了离线规划和在线规划的优点,在计算效率和路径规划精度方面都有很好的表现。
四、结论动态车辆规划问题的求解算法涵盖了多种方法,其中离线规划、在线规划和混合规划都具有各自的优劣。
汽车加油贪心算法__算法分析与设计
汽车加油贪心算法__算法分析与设计实验三1.问题描述(贪心算法) 某人自驾游,从A地往B地,全程m公里。
汽车加满汽油可行驶n公里,已知沿途:S1,S2,......Sn公里处有加油站。
请设计算法,为该人制定加油方案,使得他的加油次数最少。
2.问题分析由于汽车是由始向终点方向开的,我们最大的麻烦就是不知道在哪个加油站加油可以使我们既可以到达终点又可以使我们加油次数最少。
提出问题是解决的开始.为了着手解决遇到的困难,取得最优方案。
我们可以假设不到万不得已我们不加油,即除非我们油箱里的油不足以开到下一个加油站,我们才加一次油。
在局部找到一个最优的解。
却每加一次油我们可以看作是一个新的起点,用相同的方法进行下去。
最终将各个阶段的最优解合并为原问题的解得到我们原问题的求解。
输出没站之间的距离private void putDistance()加油站的贪心算法private int Algorithm()打印出汽车加油的车站public void printStation()package 加油贪心算法;public class AddOil {private int[] distance = {3,4,5,6,4,5}; //加油站的距离private int stationNum = distance.length; //加油站数目private int drive = 10; //驾驶距离private int addition = 0; //将要行驶的距离private Boolean[] addOil = new Boolean[stationNum];//是否在该站加油public void setAddOil(){for(int i = 0;i<stationnum;i++){< p="">addOil[i] = false;}}public AddOil(){setAddOil();}private void putDistance(){for(int i=0;i<stationnum;i++){< p="">System.out.print(i+"站距离为:"+distance[i]+'\t');}System.out.println(" ");}private int Algorithm(){ //返回加油次数int time=0; //加油次数int i;for(i=0;i<stationnum;i++){< p="">if(distance[i]>drive){System.out.println("加油站距离大于车辆驾驶距离,无法到达"); System.exit(0);}addition += distance[i];if(addition == drive){time++;addOil[i] = true;addition = 0; //加油后,从新上路,路程清0}if(addition > drive){time++;addOil[i-1] = true;addition = 0; //加油后,从新上路,路程清0i=i-1; //退回到加油站点}System.out.print("汽车至少加"+i+"......"+addition+"\n");}return time;}public void printStation(){System.out.print("汽车至少加"+Algorithm()+"次加油\n");System.out.print("汽车在:");for(int i = 0;i<stationnum;i++){< p="">if(addOil[i]){System.out.print(i+"站"+'\t');}}System.out.print("加油\n");}public static void main(String[] args){AddOil car = new AddOil();car.putDistance();car.printStation();}}程序的执行:0站距离为:3 1站距离为:4 2站距离为:5 3站距离为:10 4站距离为:4 5站距离为:5 6站距离为:4 7站距离为:6 8站距离为:4 汽车在0站已行距离为:3汽车在1站已行距离为:7汽车在1站加油,路程清为零汽车在1站已行距离为:0汽车在2站已行距离为:5汽车在2站加油,路程清为零汽车在2站已行距离为:0汽车在3站加油,路程清为零汽车在3站已行距离为:0汽车在4站已行距离为:4汽车在5站已行距离为:9汽车在5站加油,路程清为零汽车在5站已行距离为:0汽车在6站已行距离为:4汽车在7站加油,路程清为零汽车在7站已行距离为:0汽车在8站已行距离为:4汽车至少加5次加油汽车在:1站 2站3站5站7站加油0站距离为:3 1站距离为:4 2站距离为:5 3站距离为:11 4站距离为:4 5站距离为:5 6站距离为:4 7站距离为:6 汽车在0站已行距离为:3汽车在1站已行距离为:7汽车在1站加油,路程清为零汽车在1站已行距离为:0汽车在2站已行距离为:5加油站距离大于车辆驾驶距离,无法到达0站距离为:3 1站距离为:4 2站距离为:5 3站距离为:8 4站距离为:4 5站距离为:5 6站距离为:4 7站距离为:6 8站距离为:6 9站距离为:8汽车在0站已行距离为:3汽车在1站已行距离为:7汽车在1站加油,路程清为零汽车在1站已行距离为:0汽车在2站已行距离为:5汽车在2站加油,路程清为零汽车在2站已行距离为:0 汽车在3站已行距离为:8 汽车在3站加油,路程清为零汽车在3站已行距离为:0 汽车在4站已行距离为:4 汽车在5站已行距离为:9 汽车在5站加油,路程清为零汽车在5站已行距离为:0 汽车在6站已行距离为:4 汽车在7站加油,路程清为零汽车在7站已行距离为:0 汽车在8站已行距离为:6 汽车在8站加油,路程清为零汽车在8站已行距离为:0 汽车在9站已行距离为:8 汽车至少加6次加油汽车在:1站 2站3站5站7站8站加油</stationnum;i++){<> </stationnum;i++){<> </stationnum;i++){<> </stationnum;i++){<>。
算法设计及分析试题及答案解析
算法设计与分析1、(1) 证明:O(f)+O(g)=O(f+g)(7分)(2) 求下列函数的渐近表达式:(6分)① 3n 2+10n;② 21+1/n;2、对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。
(15分)(1);5log )(;log )(2+==n n g n n f (2);)(;log )(2n n g n n f == (3);log )(;)(2n n g n n f == 3、试用分治法对数组A[n]实现快速排序。
(13分)4、试用动态规划算法实现最长公共子序列问题。
(15分)5、试用贪心算法求解汽车加油问题:已知一辆汽车加满油后可行驶n 公里,而旅途中有若干个加油站。
试设计一个有效算法,指出应在哪些加油站停靠加油,使加油次数最少。
(12分)6、试用动态规划算法实现下列问题:设A 和B 是两个字符串。
我们要用最少的字符操作,将字符串A 转换为字符串B ,这里所说的字符操作包括:(1)删除一个字符。
(2)插入一个字符。
(3)将一个字符改为另一个字符。
将字符串A 变换为字符串B 所用的最少字符操作数称为字符串A 到B 的编辑距离,记为d(A,B)。
试设计一个有效算法,对任给的两个字符串A 和B ,计算出它们的编辑距离d(A,B)。
(16分)7、试用回溯法解决下列整数变换问题:关于整数i 的变换f 和g 定义如下:⎣⎦2/)(;3)(i i g i i f ==。
对于给定的两个整数n 和m ,要求用最少的变换f 和g 变换次数将n 变为m 。
(16分)1、⑴证明:令F(n)=O(f),则存在自然数n 1、c 1,使得对任意的自然数n ≥n 1,有:F(n)≤c 1f(n)……………………………..(2分)同理可令G(n)=O(g),则存在自然数n 2、c 2,使得对任意的自然数n ≥n 2,有:G(n)≤c 2g(n)……………………………..(3分)令c 3=max{c 1,c 2},n 3=max{n 1,n 2},则对所有的n ≥n 3,有:F(n)≤c 1f(n)≤c 3f(n)G(n)≤c 2g(n)≤c 3g(n)……………………………..(5分)故有:O(f)+O(g)=F(n)+G(n)≤c 3f(n)+c 3g(n)=c 3(f(n)+g(n))因此有:O(f)+O(g)=O(f+g)……………………………..(7分)⑵ 解:① 因为;01033)103(lim 222=+-+∞→n n n n n n 由渐近表达式的定义易知:3n 2是3n 2+10n 的渐近表达式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析大作业动态规划方法解乘法表问题和汽车加油行驶问题目录1.动态规划解乘法表问题1.1问题描述------1.2算法设计思想------1.3设计方法------1.4源代码------1.5最终结果------2.动态规划解汽车加油行驶问题2.1问题描述------2.2算法设计思想------2.3设计方法------2.4源代码------2.5最终结果------3.总结1.动态规划解决乘法表问题1.1问题描述定义于字母表∑{a,b,c)上的乘法表如表所示:依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。
例如,对于字符串x=bbbba,它的一个加括号表达式为(b(bb))(ba)。
依乘法表,该表达式的值为a。
试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。
1.2算法设计思想设常量a,b,c 分别为 1, 2 ,3 。
n 为字符串的长度。
设字符串的第 i 到第 j 位乘积为 a 的加括号法有result[i][j][a] 种,字符串的第 i 到第 j 位乘积为 b 的加括号法有result[i][j][b] 种,字符串的第 i 到第 j 位乘积为 c 的加括号法有 result[i][j][c] 种。
则原问题的解是:result[i][n][a] 。
设 k 为 i 到 j 中的某一个字符,则对于 k 从 i 到 j :result[i][j][a] += result[i][k][a] * result[k + 1][j][c] +result[i][k][b] * result[k + 1][j][c] + result[i][k][c] * result[k + 1][j][a];result[i][j][b] += result[i][k][a] * result[k + 1][j][a] +result[i][k][a] * result[k + 1][j][b] + result[i][k][b] * result[k + 1][j][b];result[i][j][c] += result[i][k][b] * result[k + 1][j][a] +result[i][k][c] * result[k + 1][j][b] + result[i][k][c] * result[k + 1][j][c];输入:输入一个以a,b,c组成的任意一个字符串。
输出:计算出的加括号方式数。
1.3设计方法乘法表问题直观理解就是通过加括号使得最终运算结果为a,该问题与矩阵连乘问题类似,矩阵连乘是每一次加括号选择运算量最小的,写成数学表达式有:而乘法表问题则是计算所有加括号运算结果为a的情况数,并不要求输出加括号方式。
那么可以从乘法的最小单元两个符号相乘的所有可能开始,接着在两个符号相乘的基础上计算三个符号相乘的所有可能。
直到计算N长度的符号1-N的所有可能。
可以定义一个三维数组a[n][n][3],n为输入字符串的长度,a[i][j][0]为从字符串中第i个元素到第j个元素的子串表达式值为a的加括号方式数,a[i][j][1]为从字符串中第i个元素到第j个元素的子串表达式值为b的加括号方式数,a[i][j][2]为从字符串中第i个元素到第j个元素的子串表达式值为c的加括号方式数。
由乘法表的定义则可知啊a[i][j][0]=(对k求和,k从i到j-1)a[i][k][0]*a[i][k+1][2]+a[i][k][1]*a[i][k+1][2]+a[i][k][2]*a[i][k+1][1];同理可得到a[i][j][1]和a[i][j][2]。
同时由上面的表达式可知,要计算a[i][j][],需先计算a[i][k][]和a[i][k +1][],这里k从i到j-1,故a[i][j][]可采取如下的计算次序1.4源代码#include "iostream"#include "algorithm"#include "fstream"using namespace std;/*f[i][j][0] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为a f[i][j][1] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为b f[i][j][2] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为ca = a*c || b*c || c*ab = a*a || a*b || b*bc = b*a || c*b || c*c */int f[50][50][3];char chars[3] = {'a', 'b', 'c'};int mul(int n, char ch[]){for(int i=0; i<n; i++)for(int k=0; k<3; k++)f[i][i][k] = (ch[i] == chars[k] ? 1: 0);/*a = a*c || b*c || c*ab = a*a || a*b || b*bc = b*a || c*b || c*c*/for(int r=1; r<n; r++) //规模for(i=0; i<n-r; i++) //区间左端点{int j = i + r; //区间右端点for(int k=i; k<j; k++) //断点{f[i][j][0] += f[i][k][0]*f[k+1][j][2] + f[i][k][1]*f[k+1][j][2] + f[i][k][2]*f[k+1][j][0];f[i][j][1] += f[i][k][0]*f[k+1][j][0] + f[i][k][0]*f[k+1][j][1] + f[i][k][1]*f[k+1][j][1];f[i][j][2] += f[i][k][1]*f[k+1][j][0] + f[i][k][2]*f[k+1][j][1] + f[i][k][2]*f[k+1][j][2];}}return f[0][n-1][0];}int main(){ifstream fin("mul.txt");cout << "输入字符串:";char ch[100];fin >> ch; cout << ch;int n = strlen(ch);cout << "\n结果为a的加括号方式为:" << mul(n, ch) << endl;fin.close();return 0;}1.5最终结果2.动态规划解决汽车加油行驶问题2.1问题描述给定一个N*N的方形网络,设其左上角为起点○,坐标为(1,1),X轴向右为正,Y轴向下为正,每个方格边长为1。
一辆汽车从起点○出发驶向右下角终点,其坐标为(M,N)。
在若干网格交叉点处,设置了油库,可供汽车在行驶途中,可供汽车在行驶途中加油。
汽车在行驶过程中应遵守如下规则:(1)汽车只能沿网格边行驶,装满油后能行驶K条网格边。
出发时汽车已装满油,在起点与终点处不设油库。
(2)当汽车行驶经过一条网格边时,若其X坐标或Y坐标减小,则应付费用B,否则免付费用。
(3)汽车在行驶过程中遇油库则应加满油并付加油费用A。
(4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费A)。
(5)(1)~(4)中的各数N,K,A,B,C均为正整数。
2.2算法设计思想这个题目,应该说是刚开始的时候被他给吓到了,只是想着如何去把所有的条件构造起来,然后使用网络流的方式来解决问题!但是,如果真的是很冷静下来好好地思考这道题目,就会发现如果没有那些限制条件,就是一个求解最长路的题目,这样就可以直接使用SPFA来解决这个问题!关键就是在于这个每次最多只能走K个网格边,这样就是限制了活动的范围,使得有的边无法扩展!因此可以考虑使用这个分层思想的最短路问题!就是通过将每一个点进行拆分,这样,就是相当于一种分类讨论的方式!而分类讨论了之后,就知道哪些边是可以扩展的,哪些边是不能扩展的!关键点就是在于该如何选取变量来分层,这就是因情况而异了!像这道题目之中,就是通过油量的多少来扩展边的!分层思想,说穿了其实就是相当于这个动态规划之中的增加变量的方式来确定状态一样,他们的实质其实都是一样的!2.3设计方法采用的是动态规划的思想来解题,用备忘录的方法进行递归,递归的式子后面写出.不能直接以汽车行驶的费用为目标来进行动态规划,因为最优子结构性质得不到证明.所以必须把油量和费用一起考虑,作为动态规划的对象,此时就有了最优子结构性质.最优子结构性质的证明证明:假设路径M是从起点◎到终点▲的一条最小费用路径,P(x,y)是M 经过的一个点(非加油站),且油量和费用为(g,c),现假设有一条新路径Q从起点◎到点P(x,y),使得其在P(x,y)点的油量和费用为(g,c'),其中c'备忘录递归刚开始的时候为每个网格点P(x,y)建立一个记录,初始化时,为该记录存入一个特殊值W,表示汽车未行驶过.那么在汽车行驶过程中,对每个待求的汽车最小费用值COST,先查看其相应的记录项C,如果存储的是初始值W,那么表示这个点P(x,y)是第一次遇到,此时计算出该点的最小费用值,并保存在其相应的记录项中,以备以后查看.若记录项C中存储的不是初始值W,那么表示该问题已经求解过了,其相应的记录项中存储的就是该点的最小费用值COST,此时要取出记录项C的值跟最新的计算出的COST进行比较,取其最小的那个数存入到C中.依此建立记录项C的值,当程序递归完成时,我们也得到了汽车行驶到(n,n)的最小费用值COST.2.4源代码#include "iostream"#include "algorithm"#include "fstream"using namespace std;#define INF 10000/*f[i][j][0]表示汽车从网格点(1,1)行驶至网格点(i,j)所需的最少费用f[i][j][1]表示汽车行驶至网格点(i,j)还能行驶的网格边数s[i][0]表示x轴方向s[i][1]表示y轴方向s[i][2]表示行驶费用f[i][j][0] = min{f[ i+s[k][0] ][ [j+s[k][1] ][0] + s[k][2]}f[i][j][1] = f[ i+s[k][0] ][ [j+s[k][1] ][1] - 1;f[1][1][0] = 0f[1][1][1] = Kf[i][j][0] = f[i][j][0] + A , f[i][j][1] = K 如果(i, j)是油库f[i][j][0] = f[i][j][0] + C + A, f[i][j][1] = K (i, j)不是油库,且f[i][j][1] = 0*/int N; //方形网络规模int A; //汽车在行驶过程中遇到油库应加满油并付加油费Aint C; //在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费A)int B; //当汽车行驶经过一条网格边时,如果其x坐标或y坐标减少,应付费用Bint K; //装满油后,还能行驶K条边int f[50][50][2];int s[4][3] = {{-1,0,0},{0,-1,0},{1,0,B},{0,1,B}};int a[50][50]; //方形网络int dyna(){int i, j, k;for (i=1;i<=N;i++){for (j=1;j<=N;j++){f[i][j][0]=INF;f[i][j][1]=K;}}f[1][1][0] = 0;f[1][1][1] = K;int count = 1;int tx, ty;while(count){count = 0;for(i=1; i<=N; i++){for(int j=1; j<=N; j++){if(i==1 && j==1)continue;int minStep = INF;int minDstep;int step, dstep;for(k=0; k<4; k++) //可走的四个方向{tx = i + s[k][0];ty = j + s[k][1];if(tx<1 || ty<1 || tx>N || ty>N) //如果出界continue;step = f[tx][ty][0] + s[k][2];dstep = f[tx][ty][1] - 1;if(a[i][j] == 1) //如果是油库{step += A;dstep = K;}if(a[i][j]==0 && dstep == 0 && (i!=N||j!=N)) //如果不是油库,且油已经用完{step += A + C;dstep = K;}if(step < minStep) //可以走{minStep = step;minDstep = dstep;}}if(f[i][j][0] > minStep) //如果有更优解{count++;f[i][j][0] = minStep;f[i][j][1] = minDstep;}}}}return f[N][N][0];}int main(){ifstream fin("car.txt");cout << "输入方格规模:";fin >> N; cout << N;cout << "\n输入装满油后能行驶的网格边数:";fin >> K; cout << K;cout << "\n输入加油费:";fin >> A; cout << A;cout << "\n输入坐标减少时应付的费用:";fin >> B; cout << B; s[2][2] = s[3][2] = B;cout << "\n输入增设油库费用:";fin >> C; cout << C;cout << "\n输入方形网络:\n";for(int i=1; i<=N; i++){for(int j=1; j<=N; j++){fin >> a[i][j];cout << a[i][j] << " ";}cout << endl;}cout << "最优行驶路线所需的费用为:" << dyna() << endl; fin.close();return 0;}2.5最终结果3.总结动态规划(Dynamic Programming, DP)思想启发于分治算法的思想,也是将复杂问题化解若干子问题,先求解小问题,再根据小问题的解得到原问题的解。