{
k=i;
while(k<=n&&s[k].tag!=0) k++; if(k>n) break;//-----没有ai,跳出 else {
for(j=k+1;j<=n;j++) if(s[j].tag==0)
if(s[k].a>s[j].a) k=j; swap(s[i].index,s[k].index); swap(s[i].tag,s[k].tag);
} }
l=i;//-----记下当前第一个bi的下标 for(i=l;i<=n-1;i++) {
k=i;
for(j=k+1;j<=n;j++)
if(s[k].b
swap(s[i].index,s[k].index); //-----只移动index和tag swap(s[i].tag,s[k].tag); } } 2.
void binarysearchtree(int a[],int b[],int n,int **m,int **s,int **w) { int i,j,k,t,l;
for(i=1;i<=n+1;i++) {
w[i][i-1]=a[i-1]; m[i][i-1]=0; }
for(l=0;l<=n-1;l++)//----l是下标j-i的差 for(i=1;i<=n-l;i++) {
j=i+l;
w[i][j]=w[i][j-1]+a[j]+b[j];
m[i][j]=m[i][i-1]+m[i+1][j]+w[i][j]; s[i][j]=i;
for(k=i+1;k<=j;k++) {
t=m[i][k-1]+m[k+1][j]+w[i][j]; if(t m[i][j]=t; s[i][j]=k; } } } } 一、 填空题(本题15分,每小题1分) 1、算法就是一组有穷的 ,它们规定了解决某一特定类型问题的 。 2、在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型。3个基本计算模型是 、 、 。 3、算法的复杂性是 的度量,是评价算法优劣的重要依据。 4、计算机的资源最重要的是 和 资源。因而,算法的复杂性有 和 之分。 5、f(n)= 6×2n+n2,f(n)的渐进性态f(n)= O( ) 6、贪心算法总是做出在当前看来 的选择。也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的 。 7、许多可以用贪心算法求解的问题一般具有2个重要的性质: 性质和 性质。 二、简答题(本题25分,每小题5分) 1、 简单描述分治法的基本思想。 2、 简述动态规划方法所运用的最优化原理。 3、 何谓最优子结构性质? 4、 简单描述回溯法基本思想。 5、 何谓P、NP、NPC问题 三、算法填空(本题20分,每小题5分) 1、n后问题回溯算法 (1)用二维数组A[N][N]存储皇后位置,若第i行第j列放有皇后,则A[i][j]为非0值,否则值为0。 (2)分别用一维数组M[N]、L[2*N-1]、R[2*N-1]表示竖列、左斜线、右斜线是否放有棋子,有则值为1,否则值为0。 for(j=0;j if( 1 ) /*安全检查*/ { A[i][j]=i+1; /*放皇后*/ 2 ; if(i==N-1) 输出结果; else 3 ;; /*试探下一行*/ 4 ; /*去皇后*/ 5 ;; } 2、数塔问题。有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大。 for(r=n-2;r>=0;r--) //自底向上递归计算 for(c=0; 1 ;c++) if( t[r+1][c]>t[r+1][c+1]) 2 ; else 3 ; 3、Hanoi算法 Hanoi(n,a,b,c) if (n==1) 1 ; else { 2 ; 3 ; Hanoi(n-1,b, a, c); } 4、Dijkstra算法求单源最短路径 d[u]:s到u的距离 p[u]:记录前一节点信息 Init-single-source(G,s) for each vertex v∈V[G] do { d[v]=∞; 1 } d[s]=0 Relax(u,v,w) if d[v]>d[u]+w(u,v) then { d[v]=d[u]+w[u,v]; 2 } dijkstra(G,w,s) 1. Init-single-source(G,s) 2. S=Φ 3. Q=V[G] 4.while Q<> Φ do u=min(Q) S=S∪{u} for each vertex 3 do 4 四、算法理解题(本题10分) 根据优先队列式分支限界法,求下图中从v1点到v9点的单源最短路径,请画出求得最优解的解空间树。要求中间被舍弃的结点用×标记,获得中间解的结点用单圆圈○框起,最优解用双圆圈◎框起。 五、算法理解题(本题5分) 设有n=2k个运动员要进行循环赛,现设计一个满足以下要求的比赛日程表: ①每个选手必须与其他n-1名选手比赛各一次; ②每个选手一天至多只能赛一次; ③循环赛要在最短时间内完成。 (1)如果n=2k,循环赛最少需要进行几天; (2)当n=23=8时,请画出循环赛日程表。 六、算法设计题(本题15分) 分别用贪心算法、动态规划法、回溯法设计0-1背包问题。要求:说明所使用的算法策略;写出算法实现的主要步骤;分析算法的时间。 七、算法设计题(本题10分) 通过键盘输入一个高精度的正整数n(n的有效位数≤240),去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n 和s,寻找一种方案,使得剩下的数字组成的新数最小。 【样例输入】 178543 S=4 【样例输出】 13 一、填空题(本题15分,每小题1分) 1.规则 一系列运算 2. 随机存取机RAM(Random Access Machine);随机存取存储程序机RASP(Random Access Stored Program Machine);图灵机(Turing Machine) 3. 算法效率 4. 时间 、空间、时间复杂度、 空间复杂度 5.2n 6. 最好 局部最优选择
相关推荐: