最大子序列和问题的求解
2018-01-21 11:44
337 查看
最大子序列和问题的求解
1. 三重循环int maxsub1(int a[], int n) { int maxsum = 0, currsum = 0; int i, j, k; for (i = 0; i < n; i++) for (j = i; j < n; j++) { for (currsum = 0, k = i; k <= j; k++) currsum += a[k]; if (currsum > maxsum) maxsum = currsum; } return (maxsum); }
复杂度:
∑ni=1(∑nj=1(j−i))
∑nj=1(j−i)=(n−i)(n−i+1)2=(n−i)22+n−i2
∑ni=1((n−i)22+n−i2)=O(n3)
2. 两重循环
int maxsub2(int a[], int n) { int maxsum = 0, currsum = 0; int i, j; for (i = 0; i < n; i++) { for (currsum = 0, j = i; j < n; j++) { currsum += a[j]; if (currsum > maxsum) maxsum = currsum; } } return (maxsum); }
3. 分治代码
int max_subseq(int a[], int first, int last) { int mid = (first + last) / 2; int max_left, max_right, max_mid; if (first > last) return (0); if (first == last) return (a[first]); max_left = max_subseq(a, first, mid); max_right = max_subseq(a, mid + 1, last); max_mid = find_overlap(a, first, mid, last); if (max_left > max_right) if (max_mid > max_left) return (max_mid); else return (max_left); else if (max_mid > max_right) return (max_mid); return (max_right); } int find_overlap(int a[], int first, int mid,int last) { int i, sum1 = 0, sum2 = 0, sum; for (i = mid, sum = 0; i >= first; i--) { sum += a[i]; if(sum > sum1) sum1 = sum; } for (i = mid + 1, sum = 0; i <= last; i++) { sum += a[i]; if(sum > sum2) sum2 = sum; } return (sum1 + sum2); }
4. 一重循环
int maxsub(int *a, int n) { int maxsum = 0; int currsum = 0, i; for (i = 0; i < n; i++) { currsum += a[i]; if (currsum > maxsum) maxsum = currsum; else if (currsum < 0) currsum = 0; } return (maxsum); }
相关文章推荐
- 求解最大子序列和问题的线性时间算法
- 【数据结构与算法】最大子序列和问题的求解
- 最大自序列和问题的求解
- java最大子序列和问题的求解
- 算法(一):最大子序列和问题的多种求解(打印子序列)
- 最大子序列问题及其求解----C 语言学习
- [leetcode]分治法求解最大子序列问题——Java实现
- 最大子序列和问题的求解(时间复杂度为O(N))
- [C++]四种方式求解最大子序列求和问题
- 最大子序列和问题的求解
- [C++]四种方式求解最大子序列求和问题
- 关于求解最大子序列和问题的总结
- 最大子序列问题及其求解
- 最大子序列问题及其求解
- 2.4.3最大子序列和问题的求解
- 算法笔记1-最大子序列和问题的求解
- 最大子序列和问题的求解
- 最大子序列和问题的求解
- 分治算法求解序列最大子和问题
- 最大子序列问题求解