算法设计与分析 吕国英 习题答案第四章
算法设计与分析习题答案1-6章
习题11.图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点 输出:相同的点 1, 一次步行2, 经过七座桥,且每次只经历过一次 3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法 1.r=m-n2.循环直到r=0 2.1 m=n 2.2 n=r 2.3 r=m-n 3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C ++描述。
//采用分治法//对数组先进行快速排序 //在依次比较相邻的差 #include <iostream> using namespace std;int partions(int b[],int low,int high) {图1.7 七桥问题int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴 qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
算法设计与分析第三版第四章课后习题答案
算法设计与分析第三版第四章课后习题答案4.1 线性时间选择问题习题4.1问题描述:给定一个长度为n的无序数组A和一个整数k,设计一个算法,找出数组A中第k小的元素。
算法思路:本题可以使用快速选择算法来解决。
快速选择算法是基于快速排序算法的思想,通过递归地划分数组来找到第k小的元素。
具体步骤如下: 1. 选择数组A的一个随机元素x作为枢纽元。
2. 使用x将数组划分为两个子数组A1和A2,其中A1中的元素小于等于x,A2中的元素大于x。
3. 如果k等于A1的长度,那么x就是第k小的元素,返回x。
4. 如果k小于A1的长度,那么第k小的元素在A1中,递归地在A1中寻找第k小的元素。
5. 如果k大于A1的长度,那么第k小的元素在A2中,递归地在A2中寻找第k-A1的长度小的元素。
6. 递归地重复上述步骤,直到找到第k小的元素。
算法实现:public class LinearTimeSelection {public static int select(int[] A, int k) { return selectHelper(A, 0, A.length - 1, k);}private static int selectHelper(int[] A, int left, int right, int k) {if (left == right) {return A[left];}int pivotIndex = partition(A, left, righ t);int length = pivotIndex - left + 1;if (k == length) {return A[pivotIndex];} else if (k < length) {return selectHelper(A, left, pivotInd ex - 1, k);} else {return selectHelper(A, pivotIndex + 1, right, k - length);}}private static int partition(int[] A, int lef t, int right) {int pivotIndex = left + (right - left) / 2;int pivotValue = A[pivotIndex];int i = left;int j = right;while (i <= j) {while (A[i] < pivotValue) {i++;}while (A[j] > pivotValue) {j--;}if (i <= j) {swap(A, i, j);i++;j--;}}return i - 1;}private static void swap(int[] A, int i, int j) {int temp = A[i];A[i] = A[j];A[j] = temp;}}算法分析:快速选择算法的平均复杂度为O(n),最坏情况下的复杂度为O(n^2)。
习题答案第四章 算法设计与分析 吕国英
习题答案第四章算法设计与分析吕国英main(void){ int buf[100]; int n; int i,j,k; scanf("%d",&n);for(i=0;i<n;i++)buf[i]=2; for(i=0;i<n-1;i++){ for(j=0;j<n-i-1;j++){ buf[j]+=2; } } for(j=0;j<n;j++){ if(buf[j]>=10){ buf[j+1]+=buf[j]/10; buf[j]=buf[j]%10; } } for(i=n-1;i>=0;i--)printf("%d",buf[i]); printf("\n"); return 0; }2、#include<stdio、h>int main(void){int n=2;inti;for(i=1;i<=9;i++){n=(n+2)*2;}printf("%d\n",n);return 0;}3、#include<stdio、h>int main(void){int a=54;int n;int m;printf("计算机先拿3张牌\n");a=a-3;while(a>=0){printf("还剩%d张牌\n",a);printf("你拿几张?请输入:");scanf("%d",&n);if(n>4||n<1||n>a){printf("错误!重新拿牌\n");continue;}a=a-n;printf("还剩%d张牌\n",a);if(a==0)break;m=5-n;printf("计算机拿%d\n",m);a=a-m;}return 0;}4、#include<stdio、h>int d;int a1,a2;intfun(int n);int main(void){intn;printf("n=?,d=?,a1=?,a2=?");scanf("%d%d%d%d\n",&n,&d,&a 1,&a2);printf("%d\n",fun(n));return 0;}int fun(intn){if(n==1)return a1;if(n==2)return a2;return fun(n-2)-(fun(n-1)-d)*2;}5、#include<stdio、h>char chess[8][8];int is_safe(int row,int col);int queen(int row,int col,int n);int main(void){inti,j;for(i=0;i<8;i++)for(j=0;j<8;j++)chess[i][j]=X;queen(0 ,0,0);for(i=0;i<8;i++){for(j=0;j<8;j++)printf("%c",chess[i][j]);printf("\n");}return 0;}int is_safe(int row,int col){inti,j;for(i=0;i<8;i++){if(chess[row][i]==Q)return0;if(chess[i][col]==Q)return 0;}i=row;j=col;while(i!=-1&&j!=-1){if(chess[i--][j--]==Q)return0;}i=row;j=col;while(i!=-1&&j!=8){if(chess[i--][j++]==Q)return 0;}i=row;j=col;while(i!=8&&j!=-1){if(chess[i++][j--]==Q)return0;}i=row;j=col;while(i!=8&&j!=8){if(chess[i++][j++]==Q)re turn 0;}return1;}int queen(int row,int col,int n){inti,j;intresult=0;if(n==8)return1;elseif(is_safe(row,col)){chess[r ow][col]=Q;for(i=0;i<8;i++)for(j=0;j<8;j++){result+=queen (i,j,n+1);if(result>0)break;}if(result>0)return1;else{chess[row][col]=X;return 0;}}elsereturn 0;}6、#include<stdio、h>int main(void){inti,j,k;for(i=1;i<=33;i++)for(j=1;j<=50;j++){k=100-i-j;if(k%2==0){if(3*i+2*j+k/2==100)printf("大马%d\n中马%d\n 小马%d\n\n\n",i,j,k);}}return 0;}7、#include<stdio、h>int main(void){inti;for(i=1;i<=10000;i++){if(i%2==1&&i%3==2&&i%5==4&&i%6==5 &&i%7==0)printf("%d\n",i);}return 0;}8、#include<stdio、h>int main(void){int i;int sum;inta1,a2,a3,a4;for(i=1000;i<=9999;i++){a1=i%10;a2=i/10%10;if (a1!=a2){a3=i/100%10;if(a1!=a3&&a2!=a3){a4=i/1000;if(a1!= a4&&a2!=a4&&a3!=a4){sum=(a1+a2+a3+a4)*(a1+a2+a3+a4);if(i% sum==0)printf("%d\n",i);}}}}return 0;}9、#include<stdio、h> #define N10 void max_min(int *a,int m,int n,int*min1,int *min2,int *max1,int *max2); int main(void) { int a[N]={2,3,4,5,34,7,9,6,43,21}; int min1,min2; int max1,max2; max_min(a,0,N-1,&min1,&min2,&max1,&max2); printf("min1=%d\nmin2=%d\nmax1=%d\nmax2=%d\n",min1,min2,m ax1,max2); return 0; } void max_min(int *a,int m,intn,int *min1,int *min2,int *max1,int *max2){ int lmin1,lmin2,lmax1,lmax2; intrmin1,rmin2,rmax1,rmax2; int mid; if(m==n){ *min1=*min2=*max1=*max2=a[m]; } else if(m==n-1){ if(a[m]<a[n]){ *min1=a[m]; *min2=a[n]; *max1=a[n]; *max2=a[m]; } else { *min1=a[n]; *min2=a[m]; *max1=a[m]; *max2=a[n]; } } else { mid=(m+n)/2;max_min(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2);max_min(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2);if(lmin1<rmin1){ if(lmin2<rmin1){ *min1=lmin1; *min2=lmin2; } else { *min1=lmin1;*min2=rmin1; } } else if(rmin2<lmin1){ *min1=rmin1; *min2=rmin2; } else { *min1=rmin1;*min2=lmin1; } if(lmax1>rmax1){ if(lmax2>rmax1){ *max1=lmax1; *max2=lmax2; } else { *max1=lmax1;*max2=rmax1; } } else if(rmax2>lmax1){ *max1=rmax1; *max2=rmax2; } else { *max1=rmax1;*max2=lmax1; } } }10、#include<stdio、h> int add(int *a,int flag,int right); int main(void){ int a[10]={1,2,3,4,5,6,7,8,9,10}; intsum=add(a,0,9); printf("%d\n",sum); return 0; } intadd(int *a,int flag,int right){ int mid; if(flag==right){ return a[flag]; } else if(flag==right-1){ return a[flag]+a[right]; } else{ mid=(flag+right)/2; returnadd(a,flag,mid)+add(a,mid+1,right); } }11、#include<stdio、h>int main(void){int a[5][3]={{-50,17,-42},{-47,-19,-3},{36,-34,-43},{-30,-43,34},{-23,-8,-45}};int i,j;int max,n;intsum=0;for(i=0;i<5;i++){max=a[i][0];n=0;for(j=1;j<3;j++){i f(a[i][j]>max){max=a[i][j];n=j;}}sum+=max;printf("a[%d][%d]=%d\n",i,n,max);}printf("%d\n",sum);return 0;}12、/* * File: newmain、c* Author: nirnava** Created on全文结束》》年4月22日, 下午5:21*/#include<stdio、h>#include<stdlib、h>#define N4void matrix_mul(int*mul1,int *mul2,int *mul3,int length);voidmatrix_add_sub(int * A,int * B,int * C,int m,charch);void update_half_value(int * A,int * B,int m);void get_half_value(int * A,int * B,int m);int main(void){int i,j;int mul1[N*N]={1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6};intmul2[N*N]={7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2};intmul3[N*N];matrix_mul(mul1,mul2,mul3,N);for(i=0;i<N*N;i++) {printf("%5d",mul3[i]);if((i+1)%N==0)printf("\n");}return 0;}void matrix_add_sub(int * A,int * B,int * C,int m,char ch){inti;for(i=0;i<m*m;i++){if(ch==+)C[i]=A[i]+B[i];elseC[i]=A[i ]-B[i];}}void update_half_value(int * A,int * B,intm){inti,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){B[i*m+j]=A[i*m/ 2+j];}}}void get_half_value(int * A,int * B,int m){inti,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){A[i*m/2+j]=B[i* m+j];}}}void matrix_mul(int *A,int *B,int *C,intm){if(m==2){int D,E,F,G,H,I,J;D=A[0]*(B[1]-B[3]);E=A[3]*(B[2]-B[0]);F=(A[2]+A[3])*B[0];G=(A[0]+A[1])*B[3];H=(A[2]-A[0])*(B[0]+B[1]);I=(A[1]-A[3])*(B[2]+B[3]);J=(A[0]+A[3])*(B[0]+B[3]);C[0]=E+I+J-G;C[1]=D+G;C[2]=E+F;C[3]=D+H+J-F;return ;}else{intA1[m*m/4],A2[m*m/4],A3[m*m/4],A4[m*m/4];intB1[m*m/4],B2[m*m/4],B3[m*m/4],B4[m*m/4];intC1[m*m/4],C2[m*m/4],C3[m*m/4],C4[m*m/4];intD[m*m/4],E[m*m/4],F[m*m/4],G[m*m/4],H[m*m/4],I[m*m/4],J[m*m/4];inttemp1[m*m/4],temp2[m*m/4];get_half_value(A1,&A[0],m);get_ half_value(A2,&A[m/2],m);get_half_value(A3,&A[m*m/2],m);g et_half_value(A4,&A[m*m/2+m/2],m);get_half_value(B1,&B[0] ,m);get_half_value(B2,&B[m/2],m);get_half_value(B3,&B[m*m /2],m);get_half_value(B4,&B[m*m/2+m/2],m);matrix_add_sub( B2,B4,temp1,m/2,-);matrix_mul(A1,temp1,D,m/2);matrix_add_sub(B3,B1,temp1,m /2,-);matrix_mul(A4,temp1,E,m/2);matrix_add_sub(A3,A4,temp1,m /2,+);matrix_mul(temp1,B1,F,m/2);matrix_add_sub(A1,A2,tem p1,m/2,+);matrix_mul(temp1,B4,G,m/2);matrix_add_sub(A3,A1 ,temp1,m/2,-);matrix_add_sub(B1,B2,temp2,m/2,+);matrix_mul(temp1,temp 2,H,m/2);matrix_add_sub(A2,A4,temp1,m/2,-);matrix_add_sub(B3,B4,temp2,m/2,+);matrix_mul(temp1,temp 2,I,m/2);matrix_add_sub(A1,A4,temp1,m/2,+);matrix_add_sub (B1,B4,temp2,m/2,+);matrix_mul(temp1,temp2,J,m/2);matrix_ add_sub(E,I,temp1,m/2,+);matrix_add_sub(J,G,temp2,m/2,-);matrix_add_sub(temp1,temp2,C1,m/2,+);matrix_add_sub(D,G ,C2,m/2,+);matrix_add_sub(E,F,C3,m/2,+);matrix_add_sub(D, H,temp1,m/2,+);matrix_add_sub(J,F,temp2,m/2,-);matrix_add_sub(temp1,temp2,C4,m/2,+);update_half_value( C1,&C[0],m);update_half_value(C2,&C[m/2],m);update_half_v alue(C3,&C[m*m/2],m);update_half_value(C4,&C[m*m/2+m/2],m );return ;}}13、#include<stdio、h>int main(void){inta[6][7]={{16,4,3,12,6,0,3},{4,-5,6,7,0,0,2},{6,0,-1,-2,3,6,8},{5,3,4,0,0,-2,7},{-1,7,4,0,7,-5,6},{0,-1,3,4,12,4,2}};int b[6][7],c[6][7];int i,j,k;int max;int flag;inttemp;for(i=0;i<6;i++)for(j=0;j<7;j++){b[i][j]=a[i][j];c[i ][j]=-1;}for(i=1;i<5;i++){for(j=0;j<7;j++){max=0;for(k=j-2;k<=j+2;k++){if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max){max=b[i][j]+b[i-1][k];flag=k;}}}b[i][j]=max;c[i][j]=flag;}}for(j=1;j<=5;j ++){max=0;for(k=j-2;k<=j+2;k++){if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max){max=b[i][j]+b[i-1][k];flag=k;}}}b[i][j]=max;c[i][j]=flag;}max=0;for(j=1;j <=5;j++){if(b[i][j]>max){max=b[i][j];flag=j;}}printf("%d\ n",max);temp=c[i][flag];printf("%5d",a[i][temp]);for(j=i; j>0;j--){temp=c[j][temp];printf("%5d",a[j-1][temp]);}printf("\n");return 0;}14、#include<stdio、h>int main(void){intA[6]={0,3,7,9,12,13};int B[6]={0,5,10,11,11,11};intC[6]={0,4,6,11,12,12};int AB[6][6];int temp[6];intabc[6];int max;int flag;inti,j,k;for(i=0;i<=5;i++){max=0;for(j=0;j<=i;j++){AB[i][j]= A[i-j]+B[j];if(AB[i][j]>max)max=AB[i][j];}temp[i]=max;}max=0; for(i=0;i<=5;i++){abc[i]=temp[i]+C[5-i];if(abc[i]>max){max=abc[i];flag=i;}}printf("max=%d\n",m ax);printf("c=%d\n",5-flag);max=max-C[5-flag];for(i=0;i<=flag;i++){if(AB[flag][i]==max){printf("b =%d\n",i);printf("a=%d\n",flag-i);break;}}return 0;}16、#include<stdio、h>#define N100int search(int*a,int left,int right);int sum_buf(int *a,int left,int right);int main(void){int a[N];int i;ints;for(i=0;i<N;i++)a[i]=1;a[24]=2;s=search(a,0,N-1);printf("%d\n",s);return 0;}int sum_buf(int *a,int left,int right){int i;intsum=0;for(i=left;i<=right;i++)sum+=a[i];return sum;}int search(int *a,int left,int right){intmid=(left+right)/2;if(left==right-1){if(a[left]<a[right])return right;elsereturnleft;}if(mid*2!=(right+left-1)){if(sum_buf(a,left,mid-1)>sum_buf(a,mid+1,right)){return search(a,left,mid-1);}elseif(sum_buf(a,left,mid-1)<sum_buf(a,mid+1,right)){returnsearch(a,mid+1,right);}elsereturnmid;}else{if(sum_buf(a,left,mid)>sum_buf(a,mid+1,right))r eturn search(a,left,mid);elsereturnsearch(a,mid+1,right);}}17、#include<stdio、h>intjob[6][2]={{3,8},{12,10},{5,9},{2,6},{9、3},{11,1}};int x[6],bestx[6],f1=0,bestf,f2[7]={0};void try(int i);void swap(int a,int b);int main(void){inti,j;bestf=32767;for(i=0;i<6;i++)x[i]=i;try(0);for(i=0;i<6 ;i++)printf("%d",bestx[i]);printf("\nbestf=%d\n",bestf);return 0;}void try(int i){intj;if(i==6){for(j=0;j<6;j++)bestx[j]=x[j];bestf=f2[i];}els e{for(j=i;j<6;j++){f1=f1+job[x[j]][0];if(f2[i]>f1)f2[i+1] =f2[i]+job[x[j]][1];elsef2[i+1]=f1+job[x[j]][1];if(f2[i+1 ]<bestf){swap(i,j);try(i+1);swap(i,j);}f1=f1-job[x[j]][0];}}}void swap(int i,int j){inttemp;temp=x[i];x[i]=x[j];x[j]=temp;}18、#include<stdio、h>#define N5 //N个数字#define M2 //M个加号char buf[N];int a[N];char b[M+1][N];intc[M+1];int try(int t);void swap(int t1,int t2);intadd();void output();int min=99999;int main(){inti;for(i=0;i<N;i++){scanf("%c",&buf[i]);}a[0]=0;for(i=1;i< =M;i++){a[i]=1;}for(;i<N;i++){a[i]=0;}try(1);output();pri ntf("%d\n",min);return 0;}int try(int t){int j;int i;int sum;if(t>=N){sum=add();if(sum<min){min=sum;for(i=0;i<M+1; i++){c[i]=atoi(b[i]);}}/*for(i=0;i<N;i++){printf("%d",a[i ]);}printf("\n");*/}else{for(j=t;j<N;j++){//if(a[t]!=a[j] ){swap(t,j);try(t+1);swap(t,j);}//else//try(t+1);}}}void swap(int t1,int t2){intt;t=a[t1];a[t1]=a[t2];a[t2]=t;}int add(){int sum=0;inti=0;int j;int k=0;inth=0;for(i=0;i<M+1;i++)for(j=0;j<N;j++)b[i][j]=Q;i=0;j=0;h =0;k=0;for(j=0;j<N;j++){if(a[j]==1){h=0;i++;b[i][h]=buf[j ];//printf("%d ",atoi(b[i]));//printf("%d %d %c\n",i,h,b[i][h]);h++;}else{b[i][h]=buf[j];//printf("%d %d %c \n",i,h,b[i][h]);//printf("%d",atoi(b[i]));h++;}}/*for(i=0;i<M+1;i++){for(j=0;j<N;j++) printf("%c",b[i][j]);printf("\n");}*/for(i=0;i<M+1;i++){sum+=atoi(b[i]);}return sum;}void output(){inti;for(i=0;i<M+1;i++){printf("%d",atoi(b[i]));if(i!=M)printf("+");}printf("=");}19、#include<stdio、h>int main(void){int buf[100];int m,n;inti,j;buf[0]=1;buf[1]=1;scanf("%d%d",&n,&m);for(i=1;i<n;i++){buf[i+1]=buf[i];for(j=i;j>0;j--){buf[j]=buf[j]+buf[j-1];}}printf("%d\n",buf[m]);return 0;}20、#include<stdio、h> int max_sum4(int *a,int n);int max_sub_sum(int *a,int left,int right); int main(void) { int a[6]={-2,11,-4,13,-5,-2};printf("%d\n",max_sum4(a,5)); return 0; } intmax_sum4(int *a,int n){ return max_sub_sum(a,0,n); } int max_sub_sum(int*a,int left,int right){ intcenter,i,max,left_sum,right_sum,s1,s2,s3,s4,lefts,rights, leftl,rightl; int buf[4]; if(left==right)return a[left]; else { center=(left+right)/2;left_sum=max_sub_sum(a,left,center);right_sum=max_sub_sum(a,center+1,right); s1=0; lefts=0;for(i=center;i>=left;i--){ lefts+=a[i]; if(lefts>s1)s1=lefts; } s2=0; rights=0;for(i=center+1;i<=right;i++){ rights+=a[i]; if(rights>s2)s2=rights; } s3=0; leftl=0; for(i=left;i<=center;i++) { leftl+=a[i]; if(leftl>s3)s3=leftl; } s4=0; rightl=0;for(i=right;i>=center+1;i--){ rightl+=a[i]; if(rightl>s4)s4=rightl; } buf[0]=s1+s2; buf[1]=s4+s3;buf[2]=left_sum; buf[3]=right_sum; max=0;for(i=0;i<=3;i++){ if(buf[i]>max)max=buf[i]; } return max; } }。
算法设计与分析知到章节答案智慧树2023年山东科技大学
算法设计与分析知到章节测试答案智慧树2023年最新山东科技大学第一章测试1.程序运行结果往往与输入相关,所以程序可以不满足确定性()参考答案:错2.有关算法分析的事后统计法正确的是()。
参考答案:结果是面向机器,面向程序员,面向语言的;测试的结果与程序的编译和运行环境有关;结果与测试的样本数据有关3.下面哪些内容是算法设计之前要完成的内容? ( )参考答案:是求精确解还是近似解;确定合适的数据结构4.函数10logn3+5logn2的渐近表达式为():参考答案:O(logn)5.下列函数根据渐近阶从低到高顺序是()参考答案:logn < n1/2 <2n <n3 <3n <n!6.研究NPC 问题的意义: 一旦某个NPC问题找到了多项式时间复杂性的算法,那么所有的NP问题都找到了多项式时间算法。
( )参考答案:对第二章测试1.直接或间接的调用自身的算法称为()。
参考答案:递归算法2.Hanoi塔问题如下图所示。
现要求将塔座A上的的所有圆盘移到塔座B上,并仍按同样顺序叠置。
移动圆盘时遵守Hanoi塔问题的移动规则。
由此设计出解Hanoi塔问题的递归算法正确的为:()参考答案:3.分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题分别解决子问题最后将子问题的解组合起来形成原问题的解。
这要求原问题和子问题()。
参考答案:问题规模不同,问题性质相同4.利用二分搜索,最坏情况下的计算时间复杂性为()。
参考答案:O (logn)5.二分搜索算法只适用()存储结构。
参考答案:顺序6.使用二分搜索算法在1000个有序元素表中搜索一个特定元素,在最坏情况下,搜索总共需要比较的次数为()。
参考答案:107.线性时间选择的时间复杂度为()。
参考答案:O(n)8.利用合并排序,其辅助空间为():参考答案:O(n)9.利用快速排序,对数的序列{16, 27, 13, 2, 15,38},选择基准16,进行一次划分,结果为():参考答案:{13, 2, 15} 16 {27, 38}10.分治策略解决棋盘覆盖问题是一个渐近意义下最优的算法.()参考答案:对第三章测试1.设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,若xm=yn则()。
算法设计与分析智慧树知到课后章节答案2023年下山东交通学院
算法设计与分析智慧树知到课后章节答案2023年下山东交通学院山东交通学院第一章测试1.解决一个问题通常有多种方法。
若说一个算法“有效”是指( )A:这个算法能在一定的时间和空间资源限制内将问题解决B:这个算法能在人的反应时间内将问题解决C:这个算法比其他已知算法都更快地将问题解决D:(这个算法能在一定的时间和空间资源限制内将问题解决)和(这个算法比其他已知算法都更快地将问题解决)答案:(这个算法能在一定的时间和空间资源限制内将问题解决)和(这个算法比其他已知算法都更快地将问题解决)2.农夫带着狼、羊、白菜从河的左岸到河的右岸,农夫每次只能带一样东西过河,而且,没有农夫看管,狼会吃羊,羊会吃白菜。
请问农夫能不能过去?()A:不一定B:不能过去 C:能过去答案:能过去3.下述()不是是算法的描述方式。
A:自然语言 B:E-R图 C:程序设计语言 D:伪代码答案:E-R图4.有一个国家只有6元和7元两种纸币,如果你是央行行长,你会设置()为自动取款机的取款最低限额。
A:40 B:29 C:30 D:42答案:305.算法是一系列解决问题的明确指令。
()A:对 B:错答案:对6.程序=数据结构+算法()A:对 B:错答案:对7.同一个问题可以用不同的算法解决,同一个算法也可以解决不同的问题。
()A:错 B:对答案:对8.算法中的每一条指令不需有确切的含义,对于相同的输入不一定得到相同的输出。
( )A:错 B:对答案:错9.可以用同样的方法证明算法的正确性与错误性 ( )A:错 B:对答案:错10.求解2个数的最大公约数至少有3种方法。
( )A:对 B:错答案:错11.没有好的算法,就编不出好的程序。
()A:对 B:错答案:对12.算法与程序没有关系。
( )A:错 B:对答案:错13.我将来不进行软件开发,所以学习算法没什么用。
( )A:错 B:对答案:错14.gcd(m,n)=gcd(n,m m od n)并不是对每一对正整数(m,n)都成立。
算法设计与分析-课后习题集答案
(2)当 时, ,所以,可选 , 。对于 , ,所以, 。
(3)由(1)、(2)可知,取 , , ,当 时,有 ,所以 。
11. (1)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(2)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(3)因为 , 。当 时, , 。所以,可选 , ,对于 , ,即 。
第二章
2-17.证明:设 ,则 。
当 时, 。所以, 。
第五章
5-4.SolutionType DandC1(int left,int right)
{while(!Small(left,right)&&left<right)
{int m=Divide(left,right);
所以n-1<=m<=n (n-1)/2;
O(n)<=m<=O(n2);
克鲁斯卡尔对边数较少的带权图有较高的效率,而 ,此图边数较多,接近完全图,故选用普里姆算法。
10.
T仍是新图的最小代价生成树。
证明:假设T不是新图的最小代价生成树,T’是新图的最小代价生成树,那么cost(T’)<cost(T)。有cost(T’)-c(n-1)<cost(t)-c(n-1),即在原图中存在一颗生成树,其代价小于T的代价,这与题设中T是原图的最小代价生成树矛盾。所以假设不成立。证毕。
13.template <class T>
select (T&x,int k)
{
if(m>n) swap(m,n);
if(m+n<k||k<=0) {cout<<"Out Of Bounds"; return false;}
2020智慧树知到《算法分析与设计》章节测试完整答案
2020智慧树知到《算法分析与设计》章节测试完整答案智慧树知到《算法分析与设计》章节测试答案第一章1、给定一个实例,如果一个算法能得到正确解答,称这个算法解答了该问题。
答案: 错2、一个问题的同一实例可以有不同的表示形式答案: 对3、同一数学模型使用不同的数据结构会有不同的算法,有效性有很大差别。
答案: 对4、问题的两个要素是输入和实例。
答案: 错5、算法与程序的区别是()A:输入B:输出C:确定性D:有穷性答案: 有穷性6、解决问题的基本步骤是()。
(1)算法设计(2)算法实现(3)数学建模(4)算法分析(5)正确性证明A:(3)(1)(4)(5)(2)B:(3)(4)(1)(5)(2)C:(3)(1)(5)(4)(2)D:(1)(2)(3)(4)(5)答案: (3)(1)(5)(4)(2)7、下面说法关于算法与问题的说法错误的是()。
A:如果一个算法能应用于问题的任意实例,并保证得到正确解答,称这个算法解答了该问题。
B:算法是一种计算方法,对问题的每个实例计算都能得到正确答案。
C:同一问题可能有几种不同的算法,解题思路和解题速度也会显著不同。
D:证明算法不正确,需要证明对任意实例算法都不能正确处理。
答案: 证明算法不正确,需要证明对任意实例算法都不能正确处理。
8、下面关于程序和算法的说法正确的是()。
A:算法的每一步骤必须要有确切的含义,必须是清楚的、无二义的。
B:程序是算法用某种程序设计语言的具体实现。
C:程序总是在有穷步的运算后终止。
D:算法是一个过程,计算机每次求解是针对问题的一个实例求解。
答案: 算法的每一步骤必须要有确切的含义,必须是清楚的、无二义的。
,程序是算法用某种程序设计语言的具体实现。
,算法是一个过程,计算机每次求解是针对问题的一个实例求解。
9、最大独立集问题和()问题等价。
A: 最大团B:最小顶点覆盖C:区间调度问题D:稳定匹配问题答案: 最大团,最小顶点覆盖10、给定两张喜欢列表,稳定匹配问题的输出是( ) 。
算法分析与设计(习题答案)
算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
算法分析与设计第二版习题答案-第三章到第五章
int bool=1;
int min;
int j;
int i;
int k;
int flag;
for(i=0;i<count;i++)
{
if(buf[i]=='(')
push(buf[i],i);
if(buf[i]==')')
{
flag=pop();
算法设计与分析(第二版)习题答案 主编:吕国英
算法设计与分析(第二版)习题答案(第三章)
第三章:
1.#include<stdlib.h>#include<stdio.h>int main(int argc,char **argv){int n;int i,j,k;int *buf;printf("请输入n的数值:");
;}for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("]",buf[i][j]); printf("\n");}return
0;}6.#include<stdio.h>#include<stdlib.h>typedef struct s_node s_list;typedef s_list *link;struct s_node{char ch;int flag;link next;};link top;void push(char ch,int flag){link newnode;newnode=(link)malloc(sizeof(s_list));newnode->ch=ch;newnode- >flag=flag;newnode-
算法分析习题参考答案第四章
第四章作业 部分参考答案1. 设有n 个顾客同时等待一项服务。
顾客i 需要的服务时间为n i t i ≤≤1,。
应该如何安排n 个顾客的服务次序才能使总的等待时间达到最小?总的等待时间是各顾客等待服务的时间的总和。
试给出你的做法的理由(证明)。
策略:对 1i t i n ≤≤进行排序,,21n i i i t t t ≤≤≤ 然后按照递增顺序依次服务12,,...,ni i i 即可。
解析:设得到服务的顾客的顺序为12,,...,n j j j ,则总等待时间为,2)1(121n n j j j j t t t n nt T +++-+=- 则在总等待时间T 中1j t 的权重最大,jn t 的权重最小。
故让所需时间少的顾客先得到服务可以减少总等待时间。
证明:设,21n i i i t t t ≤≤≤ ,下证明当按照不减顺序依次服务时,为最优策略。
记按照n i i i 21次序服务时,等待时间为T ,下证明任意互换两者的次序,T都不减。
即假设互换j i ,)(j i <两位顾客的次序,互换后等待总时间为T ~,则有.~T T ≥由于,))(())(()2)(2()1)(1(21n j i i i i i i t j t j n i t i n t n t n T +--++--++--+--=,))(())(()2)(2()1)(1(~21n i j i i i i i t j t j n i t i n t n t n T +--++--++--+--=则有.0))((~≥--=-i j i i t t i j T T同理可证其它次序,都可以由n i i i 21经过有限次两两调换顺序后得到,而每次交换,总时间不减,从而n i i i 21为最优策略。
2. 字符h a ~出现的频率分布恰好是前8个Fibonacci 数,它们的Huffman 编码是什么?将结果推广到n 个字符的频率分布恰好是前n 个Fibonacci 数的情形。
算法设计与分析课后习题解答
C1*(g1+g2)<= t1(n)+t2(n) <=c2(g1+g2)—----(3)
不失一般性假设max(g1(n),g2(n))=g1(n)。
显然,g1(n)+g2(n)<2g1(n),即g1+g2〈2max(g1,g2)
又g2(n)〉0,g1(n)+g2(n)>g1(n),即g1+g2>max(g1,g2).
算法设计与分析基础课后练习答案
习题1.1
4。设计一个计算 的算法,n是任意正整数。除了赋值和比较运算,该算法只能用到基本的四则运算操作。
算法求
//输入:一个正整数n 2
//输出:。
step1:a=1;
step2:若a*a<n转step 3,否则输出a;
step3:a=a+1转step 2;
5. a.用欧几里德算法求gcd(31415,14142)。
b。该算法稳定吗?
c.该算法在位吗?
解:
a。该算法对列表”60,35,81,98,14,47”排序的过程如下所示:
b.该算法不稳定.比如对列表"2,2*”排序
c.该算法不在位.额外空间for S and Count[]
4.(古老的七桥问题)
第2章
习题2。1
7。对下列断言进行证明:(如果是错误的,请举例)
Else return A[n—1]
a.该算法计算的是什么?
b.建立该算法所做的基本操作次数的递推关系并求解
解:
a.计算的给定数组的最小值
b.
9。考虑用于解决第8题问题的另一个算法,该算法递归地将数组分成两半。我们将它称为Min2(A[0..n-1])
算法设计与分析书后参考答案
参考答案第1章一、选择题1. C2. A3. C4. C A D B5. B6. B7. D 8. B 9. B 10. B 11. D 12. B二、填空题1. 输入;输出;确定性;可行性;有穷性2. 程序;有穷性3. 算法复杂度4. 时间复杂度;空间复杂度5. 正确性;简明性;高效性;最优性6. 精确算法;启发式算法7. 复杂性尽可能低的算法;其中复杂性最低者8. 最好性态;最坏性态;平均性态9. 基本运算10. 原地工作三、简答题1. 高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。
2. 使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。
这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。
(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。
(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。
(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
《算法设计与分析实用教程》习题参考解答
《算法设计与分析实用教程》习题参考解答《算法设计与分析实用教程》参考解答1-1 加减得1的数学游戏西西很喜欢数字游戏,今天他看到两个数,就想能否通过简单的加减,使最终答案等于1。
而他又比较厌烦计算,所以他还想知道最少经过多少次才能得到1。
例如,给出16,9:16-9+16-9+16-9-9-9+16-9-9=1,需要做10次加减法计算。
设计算法,输入两个不同的正整数,输出得到1的最少计算次数。
(如果无法得到1,则输出-1)。
(1)若输入两个不同的正整数a,b均为偶数,显然不可能得到1。
设x*a与y*b之差为“1”或“-1”,则对于正整数a,b经n=x+y-1次加减可得到1。
为了求n的最小值,令n从1开始递增,x在1——n中取值,y=n+1-x:检测d=x*a+y*b,若d=1或-1,则n=x+y-1为所求的最少次数。
(2)算法描述// 两数若干次加减结果为1的数学游戏#includevoid main(){long a,b,d,n,x,y;printf(" 请输入整数a,b: ");scanf("%ld,%ld",&a,&b);if(a%2==0 && b%2==0){ printf(" -1\n");return;}n=0;while(1){ n++;for(x=1;x<=n;x++){ y=n+1-x;d=x*a-y*b;if(d==1 || d==-1) // 满足加减结果为1{ printf(" n=%ld\n",n);return;}}}}请输入整数a,b: 2012,19961请输入整数a,b: 101,20136061-2 埃及分数式算法描述分母为整数分子为“1”的分数称埃及分数,试把真分数a/b 分解为若干个分母不为b 的埃及分数之和。
(1)寻找并输出小于a/b 的最大埃及分数1/c ;(2)若c>900000000,则退出;(3)若c ≤900000000,把差a/b-1/c 整理为分数a/b ,若a/b 为埃及分数,则输出后结束。
算法设计与分析智慧树知到课后章节答案2023年下天津大学
算法设计与分析智慧树知到课后章节答案2023年下天津大学天津大学第一章测试1.下列关于效率的说法正确的是()。
答案:提高程序效率的根本途径在于选择良好的设计方法,数据结构与算法;效率是一个性能要求,其目标应该在需求分析时给出;效率主要指处理机时间和存储器容量两个方面2.算法的时间复杂度取决于()。
答案:待处理数据的初态;问题的规模3.计算机算法指的是()。
答案:解决问题的有限运算序列4.归并排序法的时间复杂度和空间复杂度分别是()。
答案:O(nlog2n);O(n)5.将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。
()答案:错6.用渐进表示法分析算法复杂度的增长趋势。
()答案:对7.算法分析的两个主要方面是时间复杂度和空间复杂度的分析。
()答案:对8.某算法所需时间由以下方程表示,求出该算法时间复杂度()。
答案:O(nlog2n)9.下列代码的时间复杂度是()。
答案:O(log2N)10.下列算法为在数组A[0,...,n-1]中找出最大值和最小值的元素,其平均比较次数为()。
答案:3n/2-3/2第二章测试1.可用Master方法求解的递归方程的形式为()。
答案:T(n)=aT(n/b)+f(n) , a≥1, b>1, 为整数, f(n)>0.2.答案:对3.假定,, 递归方程的解是. ( )答案:对4.假设数组A包含n个不同的元素,需要从数组A中找出n/2个元素,要求所找的n/2个元素的中点元素也是数组A的中点元素。
针对该问题的任何算法需要的时间复杂度的下限必为。
( )答案:错5.使用Master方法求解递归方程的解为().答案:6.考虑包含n个二维坐标点的集合S,其中n为偶数,且所有坐标点中的均不相同。
一条竖直的直线若能把S集合分成左右两部分坐标点个数相同的子集合,则称直线L为集合S的一条分界线。
若给定集合S,则可在时间内找到这条分界线L。
( )答案:对7.答案:8.从n个数中找出前k个最小的元素并对所选择的前k个最小的元素进行排序。
(陈慧南 第3版)算法设计与分析——第4章课后习题答案
点; 其余结点的任意一个孩子的 low 值都小于结点的 d 值,其余结点都不是
关节点。 综上所述,无向图 G1 中,有 1,3,7 三个关节点。 图 G1 的双连通分图如下图所示。
1
7
0
6
3
1 2
1
的一个孩子且low3d1因此结点1是关节的一个孩子且low2d3因此结点3是关节的一个孩子且low5d7因此结点7是关节其余结点的任意一个孩子的low值都小于结点的d值其余结点都不是关节点
第四章课后习题
姓名:赵文浩 学号:16111204082 班级:2016 级计算机科学与技术 4-10 识别下图的所有关节点,画出他们的双连通分图。
3
5
7 3
3
4
图 G1的双连通分图
2. 对于图 G2,我们仍将结点 0 作为深度优先搜索的第一个结点,得到的深 度优先树如下图所示。
(0,0) 0
11
0 0
33
5 6
6 7
22
57 4 4
(1,0) 1
(2,0) 2
(3,0) 3
(4,2) 4
6 (5,0)
7 (6,3)
5 (7,3)
图 G2-深度优先搜索树和深度优先搜索数
无向图 G2的d和low值
下面进行关节点判断。 无向图 G2 的所有结点的任意一个孩子的 low 值都小于结点的 d 值,因此无 向图 G2 中不存在关节点。因此,该无向图的双连通图即为它本身,如下图所 示。
0 6
1
3
7
5
2
4
图 G2的双连通分图
(完整word版)习题答案第四章 算法设计与分析 吕国英
算法设计与分析(第二版)主编:吕国英习题答案第四章1.#include<stdio.h>int main(void){int buf[100];int n;int i,j,k;scanf("%d",&n);for(i=0;i<n;i++)buf[i]=2;for(i=0;i<n-1;i++){for(j=0;j<n-i-1;j++){buf[j]+=2;}}for(j=0;j<n;j++){if(buf[j]>=10){buf[j+1]+=buf[j]/10;buf[j]=buf[j]%10;}}for(i=n-1;i>=0;i--)printf("%d",buf[i]);printf("\n");return 0;}2.#include<stdio.h>int main(void){int n=2;int i;for(i=1;i<=9;i++){n=(n+2)*2;}printf("%d\n",n);return 0;}3.#include<stdio.h>int main(void){int a=54;int n;int m;printf("计算机先拿3张牌\n"); a=a-3;while(a>=0){printf("还剩%d张牌\n",a); printf("你拿几张?请输入:"); scanf("%d",&n);if(n>4||n<1||n>a){printf("错误!重新拿牌\n"); continue;}a=a-n;printf("还剩%d张牌\n",a);if(a==0)break;m=5-n;printf("计算机拿%d\n",m);a=a-m;}return 0;}4.#include<stdio.h>int d;int a1,a2;int fun(int n);int main(void){int n;printf("n=?,d=?,a1=?,a2=?");scanf("%d%d%d%d\n",&n,&d,&a1,&a2); printf("%d\n",fun(n));return 0;}int fun(int n){if(n==1)return a1;if(n==2)return a2;return fun(n-2)-(fun(n-1)-d)*2;}5.#include<stdio.h>char chess[8][8];int is_safe(int row,int col);int queen(int row,int col,int n); int main(void){int i,j;for(i=0;i<8;i++)for(j=0;j<8;j++)chess[i][j]='X';queen(0,0,0);for(i=0;i<8;i++){for(j=0;j<8;j++)printf("%c ",chess[i][j]);printf("\n");}return 0;}int is_safe(int row,int col){int i,j;for(i=0;i<8;i++){if(chess[row][i]=='Q')return 0;if(chess[i][col]=='Q')return 0;}i=row;j=col;while(i!=-1&&j!=-1){if(chess[i--][j--]=='Q')return 0;}i=row;j=col;while(i!=-1&&j!=8){if(chess[i--][j++]=='Q')return 0;}i=row;j=col;while(i!=8&&j!=-1){if(chess[i++][j--]=='Q')return 0;}i=row;j=col;while(i!=8&&j!=8){if(chess[i++][j++]=='Q')return 0;}return 1;}int queen(int row,int col,int n) {int i,j;int result=0;if(n==8)return 1;elseif(is_safe(row,col)){chess[row][col]='Q';for(i=0;i<8;i++)for(j=0;j<8;j++){result+=queen(i,j,n+1);if(result>0)break;}if(result>0)return 1;else{chess[row][col]='X';return 0;}}elsereturn 0;}6.#include<stdio.h>int main(void){int i,j,k;for(i=1;i<=33;i++)for(j=1;j<=50;j++){k=100-i-j;if(k%2==0){if(3*i+2*j+k/2==100)printf("大马%d\n中马%d\n小马%d\n\n\n",i,j,k); }}return 0;}7.#include<stdio.h>int main(void){int i;for(i=1;i<=10000;i++){if(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0) printf("%d\n",i);}return 0;}8.#include<stdio.h>int main(void){int i;int sum;int a1,a2,a3,a4;for(i=1000;i<=9999;i++){a1=i%10;a2=i/10%10;if(a1!=a2){a3=i/100%10;if(a1!=a3&&a2!=a3){a4=i/1000;if(a1!=a4&&a2!=a4&&a3!=a4){sum=(a1+a2+a3+a4)*(a1+a2+a3+a4);if(i%sum==0)printf("%d\n",i);}}}}return 0;}9.#include<stdio.h>#define N 10void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2); int main(void){int a[N]={2,3,4,5,34,7,9,6,43,21};int min1,min2;int max1,max2;max_min(a,0,N-1,&min1,&min2,&max1,&max2);printf("min1=%d\nmin2=%d\nmax1=%d\nmax2=%d\n",min1,min2,max1,max2);return 0;}void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2) {int lmin1,lmin2,lmax1,lmax2;int rmin1,rmin2,rmax1,rmax2;int mid;if(m==n){*min1=*min2=*max1=*max2=a[m];}elseif(m==n-1){if(a[m]<a[n]){*min1=a[m];*min2=a[n];*max1=a[n];*max2=a[m];}else{*min1=a[n];*min2=a[m];*max1=a[m];*max2=a[n];}}else{mid=(m+n)/2;max_min(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2); max_min(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2); if(lmin1<rmin1){if(lmin2<rmin1){*min1=lmin1;*min2=lmin2;}else{*min1=lmin1;*min2=rmin1;}}elseif(rmin2<lmin1)*min1=rmin1;*min2=rmin2;}else{*min1=rmin1;*min2=lmin1;}if(lmax1>rmax1){if(lmax2>rmax1){*max1=lmax1;*max2=lmax2;}else{*max1=lmax1;*max2=rmax1;}}elseif(rmax2>lmax1){*max1=rmax1;*max2=rmax2;}else{*max1=rmax1;*max2=lmax1;}}}10.#include<stdio.h>int add(int *a,int flag,int right); int main(void){int a[10]={1,2,3,4,5,6,7,8,9,10}; int sum=add(a,0,9);printf("%d\n",sum);return 0;int add(int *a,int flag,int right){int mid;if(flag==right){return a[flag];}elseif(flag==right-1){return a[flag]+a[right];}else{mid=(flag+right)/2;return add(a,flag,mid)+add(a,mid+1,right); }}11.#include<stdio.h>int main(void){int a[5][3]={{-50,17,-42},{-47,-19,-3},{36,-34,-43},{-30,-43,34},{-23,-8,-45}};int i,j;int max,n;int sum=0;for(i=0;i<5;i++){max=a[i][0];n=0;for(j=1;j<3;j++){if(a[i][j]>max){max=a[i][j];n=j;}sum+=max;printf("a[%d][%d]=%d\n",i,n,max);}printf("%d\n",sum);return 0;}12./** File: newmain.c* Author: nirnava** Created on 2010年4月22日, 下午5:21*/#include<stdio.h>#include<stdlib.h>#define N 4void matrix_mul(int *mul1,int *mul2,int *mul3,int length); void matrix_add_sub(int * A,int * B,int * C,int m,char ch); void update_half_value(int * A,int * B,int m);void get_half_value(int * A,int * B,int m);int main(void){int i,j;int mul1[N*N]={1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6};int mul2[N*N]={7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2};int mul3[N*N];matrix_mul(mul1,mul2,mul3,N);for(i=0;i<N*N;i++){printf("%5d",mul3[i]);if((i+1)%N==0)printf("\n");}return 0;}void matrix_add_sub(int * A,int * B,int * C,int m,char ch) {int i;for(i=0;i<m*m;i++){if(ch=='+')C[i]=A[i]+B[i];C[i]=A[i]-B[i];}}void update_half_value(int * A,int * B,int m) {int i,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){B[i*m+j]=A[i*m/2+j];}}}void get_half_value(int * A,int * B,int m) {int i,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){A[i*m/2+j]=B[i*m+j];}}}void matrix_mul(int *A,int *B,int *C,int m) {if(m==2){int D,E,F,G,H,I,J;D=A[0]*(B[1]-B[3]);E=A[3]*(B[2]-B[0]);F=(A[2]+A[3])*B[0];G=(A[0]+A[1])*B[3];H=(A[2]-A[0])*(B[0]+B[1]);I=(A[1]-A[3])*(B[2]+B[3]);J=(A[0]+A[3])*(B[0]+B[3]);C[0]=E+I+J-G;C[1]=D+G;C[2]=E+F;C[3]=D+H+J-F;return ;}{int A1[m*m/4],A2[m*m/4],A3[m*m/4],A4[m*m/4];int B1[m*m/4],B2[m*m/4],B3[m*m/4],B4[m*m/4];int C1[m*m/4],C2[m*m/4],C3[m*m/4],C4[m*m/4];int D[m*m/4],E[m*m/4],F[m*m/4],G[m*m/4],H[m*m/4],I[m*m/4],J[m*m/4]; int temp1[m*m/4],temp2[m*m/4];get_half_value(A1,&A[0],m);get_half_value(A2,&A[m/2],m);get_half_value(A3,&A[m*m/2],m);get_half_value(A4,&A[m*m/2+m/2],m);get_half_value(B1,&B[0],m);get_half_value(B2,&B[m/2],m);get_half_value(B3,&B[m*m/2],m);get_half_value(B4,&B[m*m/2+m/2],m);matrix_add_sub(B2,B4,temp1,m/2,'-');matrix_mul(A1,temp1,D,m/2);matrix_add_sub(B3,B1,temp1,m/2,'-');matrix_mul(A4,temp1,E,m/2);matrix_add_sub(A3,A4,temp1,m/2,'+');matrix_mul(temp1,B1,F,m/2);matrix_add_sub(A1,A2,temp1,m/2,'+');matrix_mul(temp1,B4,G,m/2);matrix_add_sub(A3,A1,temp1,m/2,'-');matrix_add_sub(B1,B2,temp2,m/2,'+');matrix_mul(temp1,temp2,H,m/2);matrix_add_sub(A2,A4,temp1,m/2,'-');matrix_add_sub(B3,B4,temp2,m/2,'+');matrix_mul(temp1,temp2,I,m/2);matrix_add_sub(A1,A4,temp1,m/2,'+');matrix_add_sub(B1,B4,temp2,m/2,'+');matrix_mul(temp1,temp2,J,m/2);matrix_add_sub(E,I,temp1,m/2,'+');matrix_add_sub(J,G,temp2,m/2,'-');matrix_add_sub(temp1,temp2,C1,m/2,'+');matrix_add_sub(D,G,C2,m/2,'+');matrix_add_sub(E,F,C3,m/2,'+');matrix_add_sub(D,H,temp1,m/2,'+');matrix_add_sub(J,F,temp2,m/2,'-');matrix_add_sub(temp1,temp2,C4,m/2,'+');update_half_value(C1,&C[0],m);update_half_value(C2,&C[m/2],m);update_half_value(C3,&C[m*m/2],m);update_half_value(C4,&C[m*m/2+m/2],m);return ;}}13.#include<stdio.h>int main(void){int a[6][7]={{16,4,3,12,6,0,3},{4,-5,6,7,0,0,2},{6,0,-1,-2,3,6,8},{5,3,4,0,0,-2,7},{-1,7,4,0,7,-5,6},{0,-1,3,4,12,4,2}};int b[6][7],c[6][7];int i,j,k;int max;int flag;int temp;for(i=0;i<6;i++)for(j=0;j<7;j++){b[i][j]=a[i][j];c[i][j]=-1;}for(i=1;i<5;i++){for(j=0;j<7;j++){max=0;for(k=j-2;k<=j+2;k++) {if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max) {max=b[i][j]+b[i-1][k]; flag=k;}}}b[i][j]=max;c[i][j]=flag;}}for(j=1;j<=5;j++){max=0;for(k=j-2;k<=j+2;k++) {if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max) {max=b[i][j]+b[i-1][k]; flag=k;}}}b[i][j]=max;c[i][j]=flag;}max=0;for(j=1;j<=5;j++){if(b[i][j]>max){max=b[i][j];flag=j;}}printf("%d\n",max);temp=c[i][flag];printf("%5d",a[i][temp]); for(j=i;j>0;j--){temp=c[j][temp];printf("%5d",a[j-1][temp]); }printf("\n");return 0;}14.#include<stdio.h>int main(void){int A[6]={0,3,7,9,12,13}; int B[6]={0,5,10,11,11,11}; int C[6]={0,4,6,11,12,12}; int AB[6][6];int temp[6];int abc[6];int max;int flag;int i,j,k;for(i=0;i<=5;i++){max=0;for(j=0;j<=i;j++){AB[i][j]=A[i-j]+B[j];if(AB[i][j]>max)max=AB[i][j];}temp[i]=max;}max=0;for(i=0;i<=5;i++){abc[i]=temp[i]+C[5-i];if(abc[i]>max){max=abc[i];flag=i;}}printf("max=%d\n",max); printf("c=%d\n",5-flag); max=max-C[5-flag];for(i=0;i<=flag;i++){if(AB[flag][i]==max){printf("b=%d\n",i);printf("a=%d\n",flag-i);break;}}return 0;}16.#include<stdio.h>#define N 100int search(int *a,int left,int right); int sum_buf(int *a,int left,int right); int main(void){int a[N];int i;int s;for(i=0;i<N;i++)a[i]=1;a[24]=2;s=search(a,0,N-1);printf("%d\n",s);return 0;}int sum_buf(int *a,int left,int right) {int i;int sum=0;for(i=left;i<=right;i++)sum+=a[i];return sum;}int search(int *a,int left,int right) {int mid=(left+right)/2;if(left==right-1){if(a[left]<a[right])return right;elsereturn left;}if(mid*2!=(right+left-1)){if(sum_buf(a,left,mid-1)>sum_buf(a,mid+1,right)) {return search(a,left,mid-1);}elseif(sum_buf(a,left,mid-1)<sum_buf(a,mid+1,right)) {return search(a,mid+1,right);}elsereturn mid;}else{if(sum_buf(a,left,mid)>sum_buf(a,mid+1,right)) return search(a,left,mid);elsereturn search(a,mid+1,right);}}17.#include<stdio.h>int job[6][2]={{3,8},{12,10},{5,9},{2,6},{9.3},{11,1}};int x[6],bestx[6],f1=0,bestf,f2[7]={0};void try(int i);void swap(int a,int b);int main(void){int i,j;bestf=32767;for(i=0;i<6;i++)x[i]=i;try(0);for(i=0;i<6;i++)printf("%d ",bestx[i]);printf("\nbestf=%d\n",bestf); return 0;}void try(int i){int j;if(i==6){for(j=0;j<6;j++)bestx[j]=x[j];bestf=f2[i];}else{for(j=i;j<6;j++){f1=f1+job[x[j]][0];if(f2[i]>f1)f2[i+1]=f2[i]+job[x[j]][1]; elsef2[i+1]=f1+job[x[j]][1];if(f2[i+1]<bestf){swap(i,j);try(i+1);swap(i,j);}f1=f1-job[x[j]][0];}}}void swap(int i,int j){int temp;temp=x[i];x[i]=x[j];x[j]=temp;}18.#include<stdio.h>#define N 5 //N个数字#define M 2 //M个加号char buf[N];int a[N];char b[M+1][N];int c[M+1];int try(int t);void swap(int t1,int t2); int add();void output();int min=99999;int main(){int i;for(i=0;i<N;i++){scanf("%c",&buf[i]);}a[0]=0;for(i=1;i<=M;i++){a[i]=1;}for(;i<N;i++){a[i]=0;}try(1);output();printf("%d\n",min);return 0;}int try(int t){int j;int i;int sum;if(t>=N){sum=add();if(sum<min){min=sum;for(i=0;i<M+1;i++){c[i]=atoi(b[i]);}}/*for(i=0;i<N;i++){printf("%d",a[i]);}printf("\n");*/}else{for(j=t;j<N;j++){//if(a[t]!=a[j]){swap(t,j);try(t+1);swap(t,j);}//else//try(t+1);}}}void swap(int t1,int t2) {int t;t=a[t1];a[t1]=a[t2];a[t2]=t;}int add(){int sum=0;int i=0;int j;int k=0;int h=0;for(i=0;i<M+1;i++)for(j=0;j<N;j++)b[i][j]='Q';i=0;j=0;h=0;k=0;for(j=0;j<N;j++){if(a[j]==1){h=0;i++;b[i][h]=buf[j];//printf("%d ",atoi(b[i]));//printf("%d %d %c \n",i,h,b[i][h]); h++;}else{b[i][h]=buf[j];//printf("%d %d %c \n",i,h,b[i][h]); //printf("%d ",atoi(b[i]));h++;}}/*for(i=0;i<M+1;i++){for(j=0;j<N;j++)printf("%c ",b[i][j]);printf("\n");}*/for(i=0;i<M+1;i++){sum+=atoi(b[i]);}return sum;}void output(){int i;for(i=0;i<M+1;i++){printf("%d",atoi(b[i]));if(i!=M)printf("+");}printf("=");}19.#include<stdio.h>int main(void){int buf[100];int m,n;int i,j;buf[0]=1;buf[1]=1;scanf("%d%d",&n,&m);for(i=1;i<n;i++){buf[i+1]=buf[i];for(j=i;j>0;j--){buf[j]=buf[j]+buf[j-1];}}printf("%d\n",buf[m]);return 0;}20.#include<stdio.h>int max_sum4(int *a,int n);int max_sub_sum(int *a,int left,int right);int main(void){int a[6]={-2,11,-4,13,-5,-2};printf("%d\n",max_sum4(a,5));return 0;}int max_sum4(int *a,int n){return max_sub_sum(a,0,n);}int max_sub_sum(int *a,int left,int right){int center,i,max,left_sum,right_sum,s1,s2,s3,s4,lefts,rights,leftl,rightl; int buf[4];if(left==right)return a[left];else{center=(left+right)/2;left_sum=max_sub_sum(a,left,center); right_sum=max_sub_sum(a,center+1,right); s1=0;lefts=0;for(i=center;i>=left;i--){lefts+=a[i];if(lefts>s1)s1=lefts;}s2=0;rights=0;for(i=center+1;i<=right;i++){rights+=a[i];if(rights>s2)s2=rights;}s3=0;leftl=0;for(i=left;i<=center;i++){leftl+=a[i];if(leftl>s3)s3=leftl;}s4=0;rightl=0;for(i=right;i>=center+1;i--){rightl+=a[i];if(rightl>s4)s4=rightl;}buf[0]=s1+s2;buf[1]=s4+s3;buf[2]=left_sum;buf[3]=right_sum;max=0;for(i=0;i<=3;i++){if(buf[i]>max)max=buf[i];}return max; }}。
习题答案第四章-算法设计与分析-吕国英
习题答案第四章-算法设计与分析-吕国英printf("n=?,d=?,a1=?,a2=?");scanf("%d%d%d%d\n",&n,&d,&a1,&a2); printf("%d\n",fun(n));return 0;}int fun(int n){if(n==1)return a1;if(n==2)return a2;return fun(n-2)-(fun(n-1)-d)*2;}5.#include<stdio.h>char chess[8][8];int is_safe(int row,int col);int queen(int row,int col,int n); int main(void){int i,j;for(i=0;i<8;i++)for(j=0;j<8;j++)chess[i][j]='X';queen(0,0,0);for(i=0;i<8;i++){for(j=0;j<8;j++)printf("%c ",chess[i][j]);printf("\n");}return 0;}int is_safe(int row,int col){int i,j;for(i=0;i<8;i++){if(chess[row][i]=='Q')return 0;if(chess[i][col]=='Q')return 0;}i=row;j=col;while(i!=-1&&j!=-1){if(chess[i--][j--]=='Q')return 0;}i=row;j=col;while(i!=-1&&j!=8){if(chess[i--][j++]=='Q')return 0;}i=row;j=col;while(i!=8&&j!=-1){if(chess[i++][j--]=='Q')return 0;}i=row;j=col;while(i!=8&&j!=8){if(chess[i++][j++]=='Q')return 0;}return 1;}int queen(int row,int col,int n) {int i,j;int result=0;if(n==8)return 1;elseif(is_safe(row,col)){chess[row][col]='Q';for(i=0;i<8;i++)for(j=0;j<8;j++){result+=queen(i,j,n+1);if(result>0)break;}if(result>0)return 1;else{chess[row][col]='X';return 0;}}elsereturn 0;}6.#include<stdio.h>int main(void){int i,j,k;for(i=1;i<=33;i++)for(j=1;j<=50;j++){k=100-i-j;if(k%2==0){if(3*i+2*j+k/2==100)printf("大马%d\n中马%d\n小马%d\n\n\n",i,j,k); }}return 0;}7.#include<stdio.h>int main(void){int i;for(i=1;i<=10000;i++){if(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0) printf("%d\n",i);}return 0;}8.#include<stdio.h>int main(void){int i;int sum;int a1,a2,a3,a4;for(i=1000;i<=9999;i++){a1=i%10;a2=i/10%10;if(a1!=a2){a3=i/100%10;if(a1!=a3&&a2!=a3){a4=i/1000;if(a1!=a4&&a2!=a4&&a3!=a4){sum=(a1+a2+a3+a4)*(a1+a2+a3+a4);if(i%sum==0)printf("%d\n",i);}}}}return 0;}9.#include<stdio.h>#define N 10void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2); int main(void){int a[N]={2,3,4,5,34,7,9,6,43,21};int min1,min2;int max1,max2;max_min(a,0,N-1,&min1,&min2,&max1,&max2);printf("min1=%d\nmin2=%d\nmax1=%d\nmax2=%d\n",min1,min2,max1,max2);return 0;}void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2) {int lmin1,lmin2,lmax1,lmax2;int rmin1,rmin2,rmax1,rmax2;int mid;if(m==n){*min1=*min2=*max1=*max2=a[m];}elseif(m==n-1){if(a[m]<a[n]){*min1=a[m];*min2=a[n];*max1=a[n];*max2=a[m];}else{*min1=a[n];*min2=a[m];*max1=a[m];*max2=a[n];}}else{mid=(m+n)/2;max_min(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2); max_min(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2); if(lmin1<rmin1){if(lmin2<rmin1){*min1=lmin1;*min2=lmin2;}else{*min1=lmin1;*min2=rmin1;}}elseif(rmin2<lmin1){*min1=rmin1;*min2=rmin2;}else{*min1=rmin1;*min2=lmin1;}if(lmax1>rmax1){if(lmax2>rmax1){*max1=lmax1;*max2=lmax2;}else{*max1=lmax1;*max2=rmax1;}}elseif(rmax2>lmax1){*max1=rmax1;*max2=rmax2;}else{*max1=rmax1;*max2=lmax1;}}}10.#include<stdio.h>int add(int *a,int flag,int right); int main(void){int a[10]={1,2,3,4,5,6,7,8,9,10}; int sum=add(a,0,9);printf("%d\n",sum);return 0;int add(int *a,int flag,int right){int mid;if(flag==right){return a[flag];}elseif(flag==right-1){return a[flag]+a[right];}else{mid=(flag+right)/2;return add(a,flag,mid)+add(a,mid+1,right); }}11.#include<stdio.h>int main(void){int a[5][3]={{-50,17,-42},{-47,-19,-3},{36,-34,-43},{-30,-43,34},{-23,-8,-45}};int i,j;int max,n;int sum=0;for(i=0;i<5;i++){max=a[i][0];n=0;for(j=1;j<3;j++){if(a[i][j]>max){max=a[i][j];n=j;}sum+=max;printf("a[%d][%d]=%d\n",i,n,max);}printf("%d\n",sum);return 0;}12./** File: newmain.c* Author: nirnava** Created on 2010年4月22日, 下午5:21*/#include<stdio.h>#include<stdlib.h>#define N 4void matrix_mul(int *mul1,int *mul2,int *mul3,int length); void matrix_add_sub(int * A,int * B,int * C,int m,char ch); void update_half_value(int * A,int * B,int m);void get_half_value(int * A,int * B,int m);int main(void){int i,j;int mul1[N*N]={1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6};int mul2[N*N]={7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2};int mul3[N*N];matrix_mul(mul1,mul2,mul3,N);for(i=0;i<N*N;i++){printf("%5d",mul3[i]);if((i+1)%N==0)printf("\n");}return 0;}void matrix_add_sub(int * A,int * B,int * C,int m,char ch) {int i;for(i=0;i<m*m;i++){if(ch=='+')C[i]=A[i]+B[i];C[i]=A[i]-B[i];}}void update_half_value(int * A,int * B,int m) {int i,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){B[i*m+j]=A[i*m/2+j];}}}void get_half_value(int * A,int * B,int m) {int i,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){A[i*m/2+j]=B[i*m+j];}}}void matrix_mul(int *A,int *B,int *C,int m) {if(m==2){int D,E,F,G,H,I,J;D=A[0]*(B[1]-B[3]);E=A[3]*(B[2]-B[0]);F=(A[2]+A[3])*B[0];G=(A[0]+A[1])*B[3];H=(A[2]-A[0])*(B[0]+B[1]);I=(A[1]-A[3])*(B[2]+B[3]);J=(A[0]+A[3])*(B[0]+B[3]);C[0]=E+I+J-G;C[1]=D+G;C[2]=E+F;C[3]=D+H+J-F;return ;}{int A1[m*m/4],A2[m*m/4],A3[m*m/4],A4[m*m/4];int B1[m*m/4],B2[m*m/4],B3[m*m/4],B4[m*m/4];int C1[m*m/4],C2[m*m/4],C3[m*m/4],C4[m*m/4];int D[m*m/4],E[m*m/4],F[m*m/4],G[m*m/4],H[m*m/4],I[m*m/4],J[m*m/4]; int temp1[m*m/4],temp2[m*m/4];get_half_value(A1,&A[0],m);get_half_value(A2,&A[m/2],m);get_half_value(A3,&A[m*m/2],m);get_half_value(A4,&A[m*m/2+m/2],m);get_half_value(B1,&B[0],m);get_half_value(B2,&B[m/2],m);get_half_value(B3,&B[m*m/2],m);get_half_value(B4,&B[m*m/2+m/2],m);matrix_add_sub(B2,B4,temp1,m/2,'-');matrix_mul(A1,temp1,D,m/2);matrix_add_sub(B3,B1,temp1,m/2,'-');matrix_mul(A4,temp1,E,m/2);matrix_add_sub(A3,A4,temp1,m/2,'+');matrix_mul(temp1,B1,F,m/2);matrix_add_sub(A1,A2,temp1,m/2,'+');matrix_mul(temp1,B4,G,m/2);matrix_add_sub(A3,A1,temp1,m/2,'-');matrix_add_sub(B1,B2,temp2,m/2,'+');matrix_mul(temp1,temp2,H,m/2);matrix_add_sub(A2,A4,temp1,m/2,'-');matrix_add_sub(B3,B4,temp2,m/2,'+');matrix_mul(temp1,temp2,I,m/2);matrix_add_sub(A1,A4,temp1,m/2,'+');matrix_add_sub(B1,B4,temp2,m/2,'+');matrix_mul(temp1,temp2,J,m/2);matrix_add_sub(E,I,temp1,m/2,'+');matrix_add_sub(J,G,temp2,m/2,'-');matrix_add_sub(temp1,temp2,C1,m/2,'+');matrix_add_sub(D,G,C2,m/2,'+');matrix_add_sub(E,F,C3,m/2,'+');matrix_add_sub(D,H,temp1,m/2,'+');matrix_add_sub(J,F,temp2,m/2,'-');matrix_add_sub(temp1,temp2,C4,m/2,'+');update_half_value(C1,&C[0],m);update_half_value(C2,&C[m/2],m);update_half_value(C3,&C[m*m/2],m);update_half_value(C4,&C[m*m/2+m/2],m);return ;}}13.#include<stdio.h>int main(void){int a[6][7]={{16,4,3,12,6,0,3},{4,-5,6,7,0,0,2},{6,0,-1,-2,3,6,8},{5,3,4,0,0,-2,7},{-1,7,4,0,7,-5,6},{0,-1,3,4,12,4,2}};int b[6][7],c[6][7];int i,j,k;int max;int flag;int temp;for(i=0;i<6;i++)for(j=0;j<7;j++){b[i][j]=a[i][j];c[i][j]=-1;}for(i=1;i<5;i++){for(j=0;j<7;j++){max=0;for(k=j-2;k<=j+2;k++) {if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max) {max=b[i][j]+b[i-1][k]; flag=k;}}}b[i][j]=max;c[i][j]=flag;}}for(j=1;j<=5;j++){max=0;for(k=j-2;k<=j+2;k++) {if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max) {max=b[i][j]+b[i-1][k]; flag=k;}}}b[i][j]=max;c[i][j]=flag;}max=0;for(j=1;j<=5;j++){if(b[i][j]>max){max=b[i][j];flag=j;}}printf("%d\n",max);temp=c[i][flag];printf("%5d",a[i][temp]); for(j=i;j>0;j--){temp=c[j][temp];printf("%5d",a[j-1][temp]); }printf("\n");return 0;}14.#include<stdio.h>int main(void){int A[6]={0,3,7,9,12,13}; int B[6]={0,5,10,11,11,11}; int C[6]={0,4,6,11,12,12}; int AB[6][6];int temp[6];int abc[6];int max;int flag;int i,j,k;for(i=0;i<=5;i++){max=0;for(j=0;j<=i;j++){AB[i][j]=A[i-j]+B[j];if(AB[i][j]>max)max=AB[i][j];}temp[i]=max;}max=0;for(i=0;i<=5;i++){abc[i]=temp[i]+C[5-i];if(abc[i]>max){max=abc[i];flag=i;}}printf("max=%d\n",max); printf("c=%d\n",5-flag); max=max-C[5-flag];for(i=0;i<=flag;i++){if(AB[flag][i]==max){printf("b=%d\n",i);printf("a=%d\n",flag-i);break;}}return 0;}16.#include<stdio.h>#define N 100int search(int *a,int left,int right); int sum_buf(int *a,int left,int right); int main(void){int a[N];int i;int s;for(i=0;i<N;i++)a[i]=1;a[24]=2;s=search(a,0,N-1);printf("%d\n",s);return 0;}int sum_buf(int *a,int left,int right) {int i;int sum=0;for(i=left;i<=right;i++)sum+=a[i];return sum;}int search(int *a,int left,int right) {int mid=(left+right)/2;if(left==right-1){if(a[left]<a[right])return right;elsereturn left;}if(mid*2!=(right+left-1)){if(sum_buf(a,left,mid-1)>sum_buf(a,mid+1,right)) {return search(a,left,mid-1);}elseif(sum_buf(a,left,mid-1)<sum_buf(a,mid+1,right)) {return search(a,mid+1,right);}elsereturn mid;}else{if(sum_buf(a,left,mid)>sum_buf(a,mid+1,right)) return search(a,left,mid);elsereturn search(a,mid+1,right);}}17.#include<stdio.h>int job[6][2]={{3,8},{12,10},{5,9},{2,6},{9.3},{11,1}};int x[6],bestx[6],f1=0,bestf,f2[7]={0};void try(int i);void swap(int a,int b);int main(void){int i,j;bestf=32767;for(i=0;i<6;i++)x[i]=i;try(0);for(i=0;i<6;i++)printf("%d ",bestx[i]);printf("\nbestf=%d\n",bestf); return 0;}void try(int i){int j;if(i==6){for(j=0;j<6;j++)bestx[j]=x[j];bestf=f2[i];}else{for(j=i;j<6;j++){f1=f1+job[x[j]][0];if(f2[i]>f1)f2[i+1]=f2[i]+job[x[j]][1]; elsef2[i+1]=f1+job[x[j]][1];if(f2[i+1]<bestf){swap(i,j);try(i+1);swap(i,j);}f1=f1-job[x[j]][0];}}}void swap(int i,int j){int temp;temp=x[i];x[i]=x[j];x[j]=temp;}18.#include<stdio.h>#define N 5 //N个数字#define M 2 //M个加号char buf[N];int a[N];char b[M+1][N];int c[M+1];int try(int t);void swap(int t1,int t2); int add();void output();int min=99999;int main(){int i;for(i=0;i<N;i++){scanf("%c",&buf[i]);}a[0]=0;for(i=1;i<=M;i++){a[i]=1;}for(;i<N;i++){a[i]=0;}try(1);output();printf("%d\n",min);return 0;}int try(int t){int j;int i;int sum;if(t>=N){sum=add();if(sum<min){min=sum;for(i=0;i<M+1;i++){c[i]=atoi(b[i]);}}/*for(i=0;i<N;i++){printf("%d",a[i]);}printf("\n");*/}else{for(j=t;j<N;j++){//if(a[t]!=a[j]){swap(t,j);try(t+1);swap(t,j);}//else//try(t+1);}}}void swap(int t1,int t2) {int t;t=a[t1];a[t1]=a[t2];a[t2]=t;}int add(){int sum=0;int i=0;int j;int k=0;int h=0;for(i=0;i<M+1;i++)for(j=0;j<N;j++)b[i][j]='Q';i=0;j=0;h=0;k=0;for(j=0;j<N;j++){if(a[j]==1){h=0;i++;b[i][h]=buf[j];//printf("%d ",atoi(b[i]));//printf("%d %d %c \n",i,h,b[i][h]); h++;}else{b[i][h]=buf[j];//printf("%d %d %c \n",i,h,b[i][h]); //printf("%d ",atoi(b[i]));h++;}}/*for(i=0;i<M+1;i++){for(j=0;j<N;j++)printf("%c ",b[i][j]);printf("\n");}*/for(i=0;i<M+1;i++){sum+=atoi(b[i]);}return sum;}void output(){int i;for(i=0;i<M+1;i++){printf("%d",atoi(b[i]));if(i!=M)printf("+");}printf("=");}19.#include<stdio.h>int main(void){int buf[100];int m,n;int i,j;buf[0]=1;buf[1]=1;scanf("%d%d",&n,&m);for(i=1;i<n;i++){buf[i+1]=buf[i];for(j=i;j>0;j--){buf[j]=buf[j]+buf[j-1];}}printf("%d\n",buf[m]);return 0;}20.#include<stdio.h>int max_sum4(int *a,int n);int max_sub_sum(int *a,int left,int right);int main(void){int a[6]={-2,11,-4,13,-5,-2};printf("%d\n",max_sum4(a,5));return 0;}int max_sum4(int *a,int n){return max_sub_sum(a,0,n);}int max_sub_sum(int *a,int left,int right){int center,i,max,left_sum,right_sum,s1,s2,s3,s4,lefts,rights,leftl,rightl; int buf[4];if(left==right)return a[left];else{center=(left+right)/2;left_sum=max_sub_sum(a,left,center); right_sum=max_sub_sum(a,center+1,right); s1=0;lefts=0;for(i=center;i>=left;i--){lefts+=a[i];if(lefts>s1)s1=lefts;}s2=0;rights=0;for(i=center+1;i<=right;i++){rights+=a[i];if(rights>s2)s2=rights;}s3=0;leftl=0;for(i=left;i<=center;i++){leftl+=a[i];if(leftl>s3)s3=leftl;}s4=0;rightl=0;for(i=right;i>=center+1;i--){rightl+=a[i];if(rightl>s4)s4=rightl;}buf[0]=s1+s2;buf[1]=s4+s3;buf[2]=left_sum;buf[3]=right_sum;max=0;for(i=0;i<=3;i++){if(buf[i]>max)max=buf[i];}return max; }}。
算法设计与程序分析习题精选含答案(第四章)
算法设计与程序分析习题精选含答案(第四章)作业四4.1.2 Alternating glassesa. There are 2n glasses standing next to each other in a row, the first n of them filled with a soda drink and the remaining n glasses empty. Make the glasses alternate in a filled-empty-filled-empty pattern in the minimum number of glass moves. [Gar78]b. Solve the same problem if 2n glasses—n with a drink and n empty—are initially in a random order答:图1 杯子分组a.两个为一组,在前n个杯子中判断偶数的杯子是否为空,不为空与同组的进行交换,共需要交换n/2次,考虑n为奇数对n/2进行向下取整即可。
b.由于最终偶数位置为空杯,奇数位置为满杯,从第一项开始遍历,如果在奇数位置出现空杯与后面偶数位置出现的第一个满杯进行交换,如果偶数位置出现满杯则与后面奇数出现的第一个空杯进行交换,每次交换使得两个位置满足条件,最坏情况是2n位置均为乱序,则需要交换n次,最好的情况为2n位置均满足条件,则交换次数为[0,n]4.1.7 Apply insertion sort to sort the list E, X, A, M, P, L, E in alphabetical order.4.2.1 Apply the DFS-based algorithm to solve the topological sorting problem for the following digraphs:答:(a) fe gb ca d从堆栈中弹出:efgbcad,反转输出为:dacbgfe(b) 由于存在回环b图不是无向回环图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析(第二版)主编:吕国英习题答案第四章1.#include<stdio.h>int main(void){int buf[100];int n;int i,j,k;scanf("%d",&n);for(i=0;i<n;i++)buf[i]=2;for(i=0;i<n-1;i++){for(j=0;j<n-i-1;j++){buf[j]+=2;}}for(j=0;j<n;j++){if(buf[j]>=10){buf[j+1]+=buf[j]/10;buf[j]=buf[j]%10;}}for(i=n-1;i>=0;i--)printf("%d",buf[i]);printf("\n");return 0;}2.#include<stdio.h>int main(void){int n=2;int i;for(i=1;i<=9;i++){n=(n+2)*2;}printf("%d\n",n);return 0;}3.#include<stdio.h>int main(void){int a=54;int n;int m;printf("计算机先拿3张牌\n"); a=a-3;while(a>=0){printf("还剩%d张牌\n",a); printf("你拿几张?请输入:"); scanf("%d",&n);if(n>4||n<1||n>a){printf("错误!重新拿牌\n"); continue;}a=a-n;printf("还剩%d张牌\n",a);if(a==0)break;m=5-n;printf("计算机拿%d\n",m);a=a-m;}return 0;}4.#include<stdio.h>int d;int a1,a2;int fun(int n);int main(void){int n;printf("n=?,d=?,a1=?,a2=?");scanf("%d%d%d%d\n",&n,&d,&a1,&a2); printf("%d\n",fun(n));return 0;}int fun(int n){if(n==1)return a1;if(n==2)return a2;return fun(n-2)-(fun(n-1)-d)*2;}5.#include<stdio.h>char chess[8][8];int is_safe(int row,int col);int queen(int row,int col,int n); int main(void){int i,j;for(i=0;i<8;i++)for(j=0;j<8;j++)chess[i][j]='X';queen(0,0,0);for(i=0;i<8;i++){for(j=0;j<8;j++)printf("%c ",chess[i][j]);printf("\n");}return 0;}int is_safe(int row,int col){int i,j;for(i=0;i<8;i++){if(chess[row][i]=='Q')return 0;if(chess[i][col]=='Q')return 0;}i=row;j=col;while(i!=-1&&j!=-1){if(chess[i--][j--]=='Q')return 0;}i=row;j=col;while(i!=-1&&j!=8){if(chess[i--][j++]=='Q')return 0;}i=row;j=col;while(i!=8&&j!=-1){if(chess[i++][j--]=='Q')return 0;}i=row;j=col;while(i!=8&&j!=8){if(chess[i++][j++]=='Q')return 0;}return 1;}int queen(int row,int col,int n) {int i,j;int result=0;if(n==8)return 1;elseif(is_safe(row,col)){chess[row][col]='Q';for(i=0;i<8;i++)for(j=0;j<8;j++){result+=queen(i,j,n+1);if(result>0)break;}if(result>0)return 1;else{chess[row][col]='X';return 0;}}elsereturn 0;}6.#include<stdio.h>int main(void){int i,j,k;for(i=1;i<=33;i++)for(j=1;j<=50;j++){k=100-i-j;if(k%2==0){if(3*i+2*j+k/2==100)printf("大马%d\n中马%d\n小马%d\n\n\n",i,j,k); }}return 0;}7.#include<stdio.h>int main(void){int i;for(i=1;i<=10000;i++){if(i%2==1&&i%3==2&&i%5==4&&i%6==5&&i%7==0) printf("%d\n",i);}return 0;}8.#include<stdio.h>int main(void){int i;int sum;int a1,a2,a3,a4;for(i=1000;i<=9999;i++){a1=i%10;a2=i/10%10;if(a1!=a2){a3=i/100%10;if(a1!=a3&&a2!=a3){a4=i/1000;if(a1!=a4&&a2!=a4&&a3!=a4){sum=(a1+a2+a3+a4)*(a1+a2+a3+a4);if(i%sum==0)printf("%d\n",i);}}}}return 0;}9.#include<stdio.h>#define N 10void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2); int main(void){int a[N]={2,3,4,5,34,7,9,6,43,21};int min1,min2;int max1,max2;max_min(a,0,N-1,&min1,&min2,&max1,&max2);printf("min1=%d\nmin2=%d\nmax1=%d\nmax2=%d\n",min1,min2,max1,max2);return 0;}void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2) {int lmin1,lmin2,lmax1,lmax2;int rmin1,rmin2,rmax1,rmax2;int mid;if(m==n){*min1=*min2=*max1=*max2=a[m];}elseif(m==n-1){if(a[m]<a[n]){*min1=a[m];*min2=a[n];*max1=a[n];*max2=a[m];}else{*min1=a[n];*min2=a[m];*max1=a[m];*max2=a[n];}}else{mid=(m+n)/2;max_min(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2); max_min(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2); if(lmin1<rmin1){if(lmin2<rmin1){*min1=lmin1;*min2=lmin2;}else{*min1=lmin1;*min2=rmin1;}}elseif(rmin2<lmin1)*min1=rmin1;*min2=rmin2;}else{*min1=rmin1;*min2=lmin1;}if(lmax1>rmax1){if(lmax2>rmax1){*max1=lmax1;*max2=lmax2;}else{*max1=lmax1;*max2=rmax1;}}elseif(rmax2>lmax1){*max1=rmax1;*max2=rmax2;}else{*max1=rmax1;*max2=lmax1;}}}10.#include<stdio.h>int add(int *a,int flag,int right); int main(void){int a[10]={1,2,3,4,5,6,7,8,9,10}; int sum=add(a,0,9);printf("%d\n",sum);return 0;int add(int *a,int flag,int right){int mid;if(flag==right){return a[flag];}elseif(flag==right-1){return a[flag]+a[right];}else{mid=(flag+right)/2;return add(a,flag,mid)+add(a,mid+1,right); }}11.#include<stdio.h>int main(void){int a[5][3]={{-50,17,-42},{-47,-19,-3},{36,-34,-43},{-30,-43,34},{-23,-8,-45}};int i,j;int max,n;int sum=0;for(i=0;i<5;i++){max=a[i][0];n=0;for(j=1;j<3;j++){if(a[i][j]>max){max=a[i][j];n=j;}sum+=max;printf("a[%d][%d]=%d\n",i,n,max);}printf("%d\n",sum);return 0;}12./** File: newmain.c* Author: nirnava** Created on 2010年4月22日, 下午5:21*/#include<stdio.h>#include<stdlib.h>#define N 4void matrix_mul(int *mul1,int *mul2,int *mul3,int length); void matrix_add_sub(int * A,int * B,int * C,int m,char ch); void update_half_value(int * A,int * B,int m);void get_half_value(int * A,int * B,int m);int main(void){int i,j;int mul1[N*N]={1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6};int mul2[N*N]={7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2};int mul3[N*N];matrix_mul(mul1,mul2,mul3,N);for(i=0;i<N*N;i++){printf("%5d",mul3[i]);if((i+1)%N==0)printf("\n");}return 0;}void matrix_add_sub(int * A,int * B,int * C,int m,char ch) {int i;for(i=0;i<m*m;i++){if(ch=='+')C[i]=A[i]+B[i];C[i]=A[i]-B[i];}}void update_half_value(int * A,int * B,int m) {int i,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){B[i*m+j]=A[i*m/2+j];}}}void get_half_value(int * A,int * B,int m) {int i,j;for(i=0;i<m/2;i++){for(j=0;j<m/2;j++){A[i*m/2+j]=B[i*m+j];}}}void matrix_mul(int *A,int *B,int *C,int m) {if(m==2){int D,E,F,G,H,I,J;D=A[0]*(B[1]-B[3]);E=A[3]*(B[2]-B[0]);F=(A[2]+A[3])*B[0];G=(A[0]+A[1])*B[3];H=(A[2]-A[0])*(B[0]+B[1]);I=(A[1]-A[3])*(B[2]+B[3]);J=(A[0]+A[3])*(B[0]+B[3]);C[0]=E+I+J-G;C[1]=D+G;C[2]=E+F;C[3]=D+H+J-F;return ;}{int A1[m*m/4],A2[m*m/4],A3[m*m/4],A4[m*m/4];int B1[m*m/4],B2[m*m/4],B3[m*m/4],B4[m*m/4];int C1[m*m/4],C2[m*m/4],C3[m*m/4],C4[m*m/4];int D[m*m/4],E[m*m/4],F[m*m/4],G[m*m/4],H[m*m/4],I[m*m/4],J[m*m/4]; int temp1[m*m/4],temp2[m*m/4];get_half_value(A1,&A[0],m);get_half_value(A2,&A[m/2],m);get_half_value(A3,&A[m*m/2],m);get_half_value(A4,&A[m*m/2+m/2],m);get_half_value(B1,&B[0],m);get_half_value(B2,&B[m/2],m);get_half_value(B3,&B[m*m/2],m);get_half_value(B4,&B[m*m/2+m/2],m);matrix_add_sub(B2,B4,temp1,m/2,'-');matrix_mul(A1,temp1,D,m/2);matrix_add_sub(B3,B1,temp1,m/2,'-');matrix_mul(A4,temp1,E,m/2);matrix_add_sub(A3,A4,temp1,m/2,'+');matrix_mul(temp1,B1,F,m/2);matrix_add_sub(A1,A2,temp1,m/2,'+');matrix_mul(temp1,B4,G,m/2);matrix_add_sub(A3,A1,temp1,m/2,'-');matrix_add_sub(B1,B2,temp2,m/2,'+');matrix_mul(temp1,temp2,H,m/2);matrix_add_sub(A2,A4,temp1,m/2,'-');matrix_add_sub(B3,B4,temp2,m/2,'+');matrix_mul(temp1,temp2,I,m/2);matrix_add_sub(A1,A4,temp1,m/2,'+');matrix_add_sub(B1,B4,temp2,m/2,'+');matrix_mul(temp1,temp2,J,m/2);matrix_add_sub(E,I,temp1,m/2,'+');matrix_add_sub(J,G,temp2,m/2,'-');matrix_add_sub(temp1,temp2,C1,m/2,'+');matrix_add_sub(D,G,C2,m/2,'+');matrix_add_sub(E,F,C3,m/2,'+');matrix_add_sub(D,H,temp1,m/2,'+');matrix_add_sub(J,F,temp2,m/2,'-');matrix_add_sub(temp1,temp2,C4,m/2,'+');update_half_value(C1,&C[0],m);update_half_value(C2,&C[m/2],m);update_half_value(C3,&C[m*m/2],m);update_half_value(C4,&C[m*m/2+m/2],m);return ;}}13.#include<stdio.h>int main(void){int a[6][7]={{16,4,3,12,6,0,3},{4,-5,6,7,0,0,2},{6,0,-1,-2,3,6,8},{5,3,4,0,0,-2,7},{-1,7,4,0,7,-5,6},{0,-1,3,4,12,4,2}};int b[6][7],c[6][7];int i,j,k;int max;int flag;int temp;for(i=0;i<6;i++)for(j=0;j<7;j++){b[i][j]=a[i][j];c[i][j]=-1;}for(i=1;i<5;i++){for(j=0;j<7;j++){max=0;for(k=j-2;k<=j+2;k++) {if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max) {max=b[i][j]+b[i-1][k]; flag=k;}}}b[i][j]=max;c[i][j]=flag;}}for(j=1;j<=5;j++){max=0;for(k=j-2;k<=j+2;k++) {if(k<0)continue;elseif(k>6)break;else{if(b[i][j]+b[i-1][k]>max) {max=b[i][j]+b[i-1][k]; flag=k;}}}b[i][j]=max;c[i][j]=flag;}max=0;for(j=1;j<=5;j++){if(b[i][j]>max){max=b[i][j];flag=j;}}printf("%d\n",max);temp=c[i][flag];printf("%5d",a[i][temp]); for(j=i;j>0;j--){temp=c[j][temp];printf("%5d",a[j-1][temp]); }printf("\n");return 0;}14.#include<stdio.h>int main(void){int A[6]={0,3,7,9,12,13}; int B[6]={0,5,10,11,11,11}; int C[6]={0,4,6,11,12,12}; int AB[6][6];int temp[6];int abc[6];int max;int flag;int i,j,k;for(i=0;i<=5;i++){max=0;for(j=0;j<=i;j++){AB[i][j]=A[i-j]+B[j];if(AB[i][j]>max)max=AB[i][j];}temp[i]=max;}max=0;for(i=0;i<=5;i++){abc[i]=temp[i]+C[5-i];if(abc[i]>max){max=abc[i];flag=i;}}printf("max=%d\n",max); printf("c=%d\n",5-flag); max=max-C[5-flag];for(i=0;i<=flag;i++){if(AB[flag][i]==max){printf("b=%d\n",i);printf("a=%d\n",flag-i);break;}}return 0;}16.#include<stdio.h>#define N 100int search(int *a,int left,int right); int sum_buf(int *a,int left,int right); int main(void){int a[N];int i;int s;for(i=0;i<N;i++)a[i]=1;a[24]=2;s=search(a,0,N-1);printf("%d\n",s);return 0;}int sum_buf(int *a,int left,int right) {int i;int sum=0;for(i=left;i<=right;i++)sum+=a[i];return sum;}int search(int *a,int left,int right) {int mid=(left+right)/2;if(left==right-1){if(a[left]<a[right])return right;elsereturn left;}if(mid*2!=(right+left-1)){if(sum_buf(a,left,mid-1)>sum_buf(a,mid+1,right)) {return search(a,left,mid-1);}elseif(sum_buf(a,left,mid-1)<sum_buf(a,mid+1,right)) {return search(a,mid+1,right);}elsereturn mid;}else{if(sum_buf(a,left,mid)>sum_buf(a,mid+1,right)) return search(a,left,mid);elsereturn search(a,mid+1,right);}}17.#include<stdio.h>int job[6][2]={{3,8},{12,10},{5,9},{2,6},{9.3},{11,1}};int x[6],bestx[6],f1=0,bestf,f2[7]={0};void try(int i);void swap(int a,int b);int main(void){int i,j;bestf=32767;for(i=0;i<6;i++)x[i]=i;try(0);for(i=0;i<6;i++)printf("%d ",bestx[i]);printf("\nbestf=%d\n",bestf); return 0;}void try(int i){int j;if(i==6){for(j=0;j<6;j++)bestx[j]=x[j];bestf=f2[i];}else{for(j=i;j<6;j++){f1=f1+job[x[j]][0];if(f2[i]>f1)f2[i+1]=f2[i]+job[x[j]][1]; elsef2[i+1]=f1+job[x[j]][1];if(f2[i+1]<bestf){swap(i,j);try(i+1);swap(i,j);}f1=f1-job[x[j]][0];}}}void swap(int i,int j){int temp;temp=x[i];x[i]=x[j];x[j]=temp;}18.#include<stdio.h>#define N 5 //N个数字#define M 2 //M个加号char buf[N];int a[N];char b[M+1][N];int c[M+1];int try(int t);void swap(int t1,int t2); int add();void output();int min=99999;int main(){int i;for(i=0;i<N;i++){scanf("%c",&buf[i]);}a[0]=0;for(i=1;i<=M;i++){a[i]=1;}for(;i<N;i++){a[i]=0;}try(1);output();printf("%d\n",min);return 0;}int try(int t){int j;int i;int sum;if(t>=N){sum=add();if(sum<min){min=sum;for(i=0;i<M+1;i++){c[i]=atoi(b[i]);}}/*for(i=0;i<N;i++){printf("%d",a[i]);}printf("\n");*/}else{for(j=t;j<N;j++){//if(a[t]!=a[j]){swap(t,j);try(t+1);swap(t,j);}//else//try(t+1);}}}void swap(int t1,int t2) {int t;t=a[t1];a[t1]=a[t2];a[t2]=t;}int add(){int sum=0;int i=0;int j;int k=0;int h=0;for(i=0;i<M+1;i++)for(j=0;j<N;j++)b[i][j]='Q';i=0;j=0;h=0;k=0;for(j=0;j<N;j++){if(a[j]==1){h=0;i++;b[i][h]=buf[j];//printf("%d ",atoi(b[i]));//printf("%d %d %c \n",i,h,b[i][h]); h++;}else{b[i][h]=buf[j];//printf("%d %d %c \n",i,h,b[i][h]); //printf("%d ",atoi(b[i]));h++;}}/*for(i=0;i<M+1;i++){for(j=0;j<N;j++)printf("%c ",b[i][j]);printf("\n");}*/for(i=0;i<M+1;i++){sum+=atoi(b[i]);}return sum;}void output(){int i;for(i=0;i<M+1;i++){printf("%d",atoi(b[i]));if(i!=M)printf("+");}printf("=");}19.#include<stdio.h>int main(void){int buf[100];int m,n;int i,j;buf[0]=1;buf[1]=1;scanf("%d%d",&n,&m);for(i=1;i<n;i++){buf[i+1]=buf[i];for(j=i;j>0;j--){buf[j]=buf[j]+buf[j-1];}}printf("%d\n",buf[m]);return 0;}20.#include<stdio.h>int max_sum4(int *a,int n);int max_sub_sum(int *a,int left,int right);int main(void){int a[6]={-2,11,-4,13,-5,-2};printf("%d\n",max_sum4(a,5));return 0;}int max_sum4(int *a,int n){return max_sub_sum(a,0,n);}int max_sub_sum(int *a,int left,int right){int center,i,max,left_sum,right_sum,s1,s2,s3,s4,lefts,rights,leftl,rightl; int buf[4];if(left==right)return a[left];else{center=(left+right)/2;left_sum=max_sub_sum(a,left,center); right_sum=max_sub_sum(a,center+1,right); s1=0;lefts=0;for(i=center;i>=left;i--){lefts+=a[i];if(lefts>s1)s1=lefts;}s2=0;rights=0;for(i=center+1;i<=right;i++){rights+=a[i];if(rights>s2)s2=rights;}s3=0;leftl=0;for(i=left;i<=center;i++){leftl+=a[i];if(leftl>s3)s3=leftl;}s4=0;rightl=0;for(i=right;i>=center+1;i--){rightl+=a[i];if(rightl>s4)s4=rightl;}buf[0]=s1+s2;buf[1]=s4+s3;buf[2]=left_sum;buf[3]=right_sum;max=0;for(i=0;i<=3;i++){if(buf[i]>max)max=buf[i];}return max; }}。