434
社区成员
发帖
与我相关
我的任务
分享一.总结与思考
在我们日常生活中,经常碰到一些复杂的事物,比如存储一大批货物等。在一般情况下,我们都不会一个人去处理这些事物,可能是分了很多个人处理,或者分成几批去处理。在我们程序设计中,也很经常处理一些规模比较大,我们整体去处理的话可能比较麻烦,分治法就能很好地去解决,比如汉诺塔问题,大整数的乘法以及棋盘覆盖问题。
分治法的基本思想是将一个规模为n的问题分解为k个规模比较小的子问题,这些子问题互相独立且与总问题一致。在这一章节的学习与编程中,我们十分频繁地使用分治法,二分搜索,归并等。分治法减少了我们的运算量,优化了程序效率。
二.最大子段和
(1)首先我自己做这道题的时候没有使用分治法,比较简单直接,大概属于动态规划
主要就是用一个过渡的sum来求最终的sum,每当新段和大于原sum,新和直接赋值给旧sum
算法复杂度为O(n^2)
int enumerationMethod(int a[],int n)
{
int finalLeft = 0;
int finalRight = 0;
int finalSum = 0;
for (int i = 0; i < n; i++) {
int transitionalSum = 0;
for (int j = i; j < n; j++) {
transitionalSum += a[j];
if (transitionalSum > finalSum) {
finalSum = transitionalSum;
finalLeft = i;
finalRight = j;
}
}
}
return finalSum;
}
(2)分治法
如果使用分治法的话,子区间求最优和的情况:(1)[left,mid]; (2)[mid,right]; (3)处于两个区间;以上三种情形的最大者,即为所求. 前两种情形符合子问题递归特性,所以递归可以求出. 对于第三种情形,则需要单独处理. 第三种情形跨区间,可以利用穷举的思路求出: