算法导论第4章习题解析
来源:互联网 发布:ps软件培训班 编辑:程序博客网 时间:2024/05/20 18:49
4.1-1 当A的所有元素均为负数,FIND-MAXMUM-SUBARRAY返回的是A中第一个最大值。
4.1-2 代码如下:
#include<limits.h>void Find_Maxmum_Violence(int A[],int low,int high,int *r){ int _left = -1; int _right = -1; int _max = INT_MIN; int _length = high - low + 1; for(int i = 0;i < _length;i++) { int sum = A[i]; int max = INT_MIN; int maxIndex = i; for(int j = i+1;j < _length;j++) { sum+=A[j]; if(sum > max) { max = sum; maxIndex = j; } } if(max > _max) { _left = i; _right = maxIndex; _max = max; } } r[0] = _left; r[1] = _right; r[2] = _max; }int main(){ int A[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7}; int result[] = {-1,-1,INT_MIN}; Find_Maxmum_Violence(A,0,15,result);}
4.1-3:略
4.1-4:修改后的代码如下:
#include<stdio.h>#include<stdlib.h>#include<limits.h>void Find_Max_Crossing_Subarray(int A[],int low,int mid,int high,int *r){ static int result[3]; int left_sum = 0; int right_sum = 0; int max_left = -1; int max_right = -1; int sum = 0; for(int i = mid;i>=low;i--) { sum+=A[i]; if(sum > left_sum) { left_sum = sum; max_left = i; } } sum = 0; for(int j = mid+1;j<=high;j++) { sum+=A[j]; if(sum > right_sum) { right_sum = sum; max_right = j; } } r[0] = max_left; r[1] = max_right; r[2] = left_sum+right_sum;}void Find_Maxmum_Subarray(int A[],int low,int high,int *r){ int result_left[3]; int result_right[3]; int result_mid[3]; if(high == low) { r[0] = low; r[1] = high; r[2] = A[low]; } else { int mid = (low+high)/2; Find_Maxmum_Subarray(A,low,mid,result_left); Find_Maxmum_Subarray(A,mid+1,high,result_right); Find_Max_Crossing_Subarray(A,low,mid,high,result_mid); if(result_left[2] >= result_right[2] && result_left[2] >= result_mid[2]) { r[0] = result_left[0]; r[1] = result_left[1]; r[2] = result_left[2]; } else if(result_right[2] >= result_left[2] && result_right[2] >= result_mid[2]) { r[0] = result_right[0]; r[1] = result_right[1]; r[2] = result_right[2]; } else { r[0] = result_mid[0]; r[1] = result_mid[1]; r[2] = result_mid[2]; } }}int main(){ int result[3]; int A[] = {-13,-3,-25,-20,-3,-16,-23,-18,-20,-7,-12,-5,-22,-15,-4,-7}; Find_Maxmum_Subarray(A,0,15,result);}
4.1-5
void Find_Maxmum_Subarry_Linear(int A[],int low,int high,int *r){ int left = low; int right = low; int sum = A[low]; int maxsum = A[low]; for(int i = low + 1; i <= high; i++) { sum+=A[i]; if(sum > maxsum) { maxsum = sum; right = i; } else { if(sum < 0 && A[i] > 0) { left = i; right = i; maxsum = A[i]; sum = A[i]; } } } r[0] = left; r[1] = right; r[2] = maxsum;}int main(){ int result[3]; int A[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7}; Find_Maxmum_Subarry_Linear(A,0,15,result);}
阅读全文
0 0
- 算法导论第4章习题解析
- 算法导论第2章习题解析
- 算法导论第3章习题解析
- 算法导论第15章习题15.1-4
- 算法导论 第7章 课后习题
- 算法导论第15章习题答案
- 算法导论课后习题解析 第六章
- 算法导论课后习题解析 第七章
- 算法导论课后习题解析 第三章
- 算法导论课后习题解析 第二章
- 算法导论习题解析----2.1-4
- 算法导论习题解-第16章贪心算法
- 算法导论 第7章部分习题解答
- 算法导论 第15章 动态规划 习题C++实现
- 算法导论习题解-第17章摊还分析
- 算法导论习题解-第18章B树
- 算法导论习题解-第23章最小生成树
- 《算法导论》 - 第6章 - 堆排序 - 习题解答
- 使用栈进行进制转换
- liunx基本命令(十一)系统日志管理
- hdu5977 Garden of Eden
- 在屏幕上打印杨辉三角
- binary-tree-preorder-traversal java code
- 算法导论第4章习题解析
- 实验三 栈和队列的基本操作实现及其应用
- DockerHub基于Github自动化构建
- 链表学习记录
- LeetCode_697_Degree of an Array
- 循环队列的实现
- Linux下Vue开发环境搭建一篇全搞定
- 数据结构实验之栈与队列四:括号匹配
- CS231N-12-Visualizing & Understanding CNN