【算法导论(第三版)】第四章部分习题代码
2014-10-23 16:45
423 查看
第4张 分治策略
分治问题:分解(Divide) -- 解决(Conquer) -- 合并(Conbine)
最大子数组问题 的 递归解法(O(n log n)):
最大子数组问题的动态规划解法(O(n))(page.42 练习4.1-5)
对于“矩阵乘法的Strassen算法”的一个疑问?
当矩阵的n为奇数时如何解决这个问题。
分治问题:分解(Divide) -- 解决(Conquer) -- 合并(Conbine)
最大子数组问题 的 递归解法(O(n log n)):
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define inf (1<<29) const int maxn = 1010; struct node { int left , right , sum; node () {} node (int left, int right, int sum) : left(left) , right(right) , sum(sum) {}; }; node find_max_crossing_subarray(int *a, int low, int mid, int high) { int max_left , max_right; int left_sum = - inf; int sum = 0; for(int i=mid;i>=low;i--) { sum += a[i]; if(sum > left_sum) { left_sum = sum; max_left = i; } } int right_sum = sum = 0; for(int i=mid+1;i<=high;i++) { sum += a[i]; if(sum > right_sum) { right_sum = sum; max_right = i; } } return node(max_left, max_right, left_sum + right_sum); } node find_maximun_subarray(int *a, int low, int high) { if(low == high) return node(low, high, a[low]); int mid = (low + high) >> 1; node nLeft = find_maximun_subarray(a, low, mid); node nRight = find_maximun_subarray(a, mid+1, high); node nCross = find_max_crossing_subarray(a, low, mid, high); if(nLeft.sum >= nRight.sum && nLeft.sum >= nRight.sum) return nLeft; else if(nRight.sum >= nCross.sum) return nRight; else return nCross; } int n , a[maxn]; node u; int main() { while(scanf("%d" , &n) != EOF) { for(int i=0;i<n;i++) scanf("%d" , &a[i]); node ans = find_maximun_subarray(a, 0, n-1); printf("[%d,%d] is the maximun: %d\n", ans.left, ans.right, ans.sum); } return 0; }
最大子数组问题的动态规划解法(O(n))(page.42 练习4.1-5)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define inf (1<<29) const int maxn = 1010; struct node { int left , right , sum; node () {} node (int left, int right, int sum) : left(left) , right(right) , sum(sum) {}; }; node find_maximun_subarray(int *a, int low, int high) { int left, right, sum, tmp_left, tmp_right, tmp; left = right = tmp_left = tmp_right = low; sum = tmp = a[low]; for(int i=low+1;i<=high;i++) { if(tmp < 0) { tmp_left = tmp_right = i; tmp = a[i]; } else { tmp_right = i; tmp += a[i]; } if(tmp > sum) { sum = tmp; left = tmp_left; right = tmp_right; } } return node(left, right, sum); } int n , a[maxn]; node u; int main() { while(scanf("%d" , &n) != EOF) { for(int i=0;i<n;i++) scanf("%d" , &a[i]); node ans = find_maximun_subarray(a, 0, n-1); printf("[%d,%d] is the maximun: %d\n", ans.left, ans.right, ans.sum); } return 0; }
对于“矩阵乘法的Strassen算法”的一个疑问?
当矩阵的n为奇数时如何解决这个问题。
相关文章推荐
- 【算法导论(第三版)】第二章部分习题代码
- 【算法导论】第三版课后习题*2.3-7
- 算法导论第三版习题8.4
- 算法导论第六章习题答案(第三版) Introduction to Algorithm
- 算法导论 python代码 第四章
- 【算法导论】第三版课后习题2-4逆序对
- 算法导论 6章堆排序的代码实现和部分课后练习
- 算法导论第三版习题5.2
- 算法导论10.1-6习题解答(用两个栈实现一个队列)
- 算法导论6.1-2习题解答
- 算法导论6.1-7习题解答
- Introduction to Algorithms 算法导论 第1章 基础知识 学习笔记及习题解答
- 算法导论9.2-3习题解答(寻找第i小的数)
- 二叉查找树——算法导论第12章简易代码实现~
- Introduction to Algorithms 算法导论 第2章 算法入门 学习笔记及习题解答
- 《C语言的科学与艺术》课后习题答案第四章(部分)
- 【算法导论】0-1背包问题 与 部分背包
- 算法导论习题5.1-3
- 算法导论12.1-3习题解答(非递归中序遍历)
- 算法导论6.3-3习题解答