4.1-1

如所有元素都为负,则返回所有元素中最大的负数。

4.1-2(暴力法求最大和子数组)

struct subarray
{
int start, end, sum;
};
void bruteFindMaxSubarray(int a[], int left, int right, struct subarray* result)
{
int i, j, sum=a[left];
int tempSum;
int l = left;
int r = l;
for(i=left; i<=right; i++)
{
tempSum = a[i];
for(j=i+; j<=right; j++)
{
tempSum += a[j];
if(tempSum > sum)
{
l = i;
r = j;
sum = tempSum;
}
}
}
result->start = l;
result->end = r;
result->sum = sum;
}

4.1-3(归并算法求最大和子数组)

int mergeFindSub(int a[], int l, int r, int result[])
{
int i, j, k, mid;
int leftSum = ;
int rightSum = ;
int crossSum = ;
int leftResult[] = {};
int rightResult[] = {};
int crossResult[] = {};
if(l == r)
{
result[] = l;
result[] = r;
result[] = a[l];
}
else
{
mid = (l + r) / ;
leftSum = mergeFindSub(a, l, mid, leftResult);
rightSum = mergeFindSub(a, mid+, r, rightResult);
crossSum = crossingSub(a, l, mid, r, crossResult);
if(leftSum >= rightSum && leftSum >= crossSum)
for(i=; i<; i++) result[i] = leftResult[i];
else if(rightSum >= leftSum && rightSum >= crossSum)
for(j=; j<; j++) result[j] = rightResult[j];
else
for(k=; k<; k++) result[k] = crossResult[k];
}
return result[];
} int crossingSub(int a[], int l, int m, int r, int result[])
{
int i, j, leftSum, rightSum, sum;
int min = -;
rightSum = min;
leftSum = min;
sum = ;
for(i=m; i>=l; i--)
{
sum += a[i];
if(sum > leftSum)
{
result[] = i;
leftSum = sum;
}
}
sum = ;
for(j=m+; j<=r; j++)
{
sum += a[j];
if(sum > rightSum)
{
result[] = j;
rightSum = sum;
}
}
result[] = leftSum + rightSum;
return result[];
}

4.1-4

如果允许空串,只要加一句

if (sum < 0)  return sum=0;

4.1-5(线性算法求最大和字串)

void linearFindSub(int a[], int n, int result[])
{
int i, l, temp, sum;
int min = -;
sum = min;
temp = ;
l = ;
for(i=; i<n; i++)
{
if(temp < )
{
temp = a[i];
l = i;
}
else
temp += a[i];
if(sum < temp)
{
result[] = l;
result[] = i;
sum = temp;
}
}
result[] = sum;
}

算法导论(第三版) Exercises4.2(求最大和子数组的算法优化过程)的更多相关文章

  1. 算法导论(第三版)Exercises2.3(归并排序、二分查找、计算集合中是否有和为X的2个元素)

    2.3-1: 3 9 26 38 41 49 52 59 3 26 41 52   9 38 49 57 3 41   52 26   38 57   9 49 3   41  52  26  38  ...

  2. 算法导论(第三版)Problems2(归并插入排序、数列逆序计算)

    讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; & ...

  3. 算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)

    关于练习程序的说明参见置顶的那篇. 2.1-1: 31 41 59 26 41 58 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 ...

  4. 求数组的子数组之和的最大值II

    这次在求数组的子数组之和的最大值的条件下又增加了新的约束:  1.要求数组从文件读取.      2.如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保 ...

  5. C#中求数组的子数组之和的最大值

    <编程之美>183页,问题2.14——求子数组的字数组之和的最大值.(整数数组) 我开始以为可以从数组中随意抽调元素组成子数组,于是就有了一种想法,把最大的元素抽出来,判断是大于0还是小于 ...

  6. 求数组的子数组之和的最大值III(循环数组)

    新的要求:一维数组改成循环数组,只是涉及简单算法,只是拿了小数做测试 想法:从文件读取数组,然后新建数组,将文件读取的数组在新数组中做一下连接,成为二倍长度的数组,然后再遍历,将每次遍历的子数组的和存 ...

  7. 算法导论 第三章 and 第四章

    第三章 渐进的基本O().... 常用函数 % 和  // 转换 斯特林近似公式 斐波那契数 第四章 分治策略:分解(递归)--解决(递归触底)--合并 求解递归式的3种方法: 1:代入法(替代法): ...

  8. "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)

    博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...

  9. 算法Sedgewick第四版-第1章基础-002一些工具类算法(Euclid’s algorithm)

    1. //Euclid’s algorithm public static int gcd(int p, int q) { if (q == 0) return p; int r = p % q; r ...

随机推荐

  1. 基于Hadoop集群的HBase集群的配置

    一  Hadoop集群部署 hadoop配置 二 Zookeeper集群部署 zookeeper配置 三  Hbase集群部署 1.配置hbase-env.sh HBASE_MANAGES_ZK:用来 ...

  2. Gulp-livereload:实时刷新编码

    实现功能 监听指定目录下的所有文件,实时动态刷新页面 安装(Install) 功能的实现是借助 gulp-connect 插件完成的;所以,首先通过下面命令完成插件安装: npm install -- ...

  3. android后台截屏实现(3)--编译screencap

    修改好之后就要编译了,screencap的编译是要在源码环境中进行的. 将修改后的screencap.cpp文件替换源码中的原始文件,然后修改screencap的Android.mk文件,修改后的文件 ...

  4. 题目:[NOIP1999]拦截导弹(最长非递增子序列DP) O(n^2)和O(n*log(n))的两种做法

    题目:[NOIP1999]拦截导弹 问题编号:217 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 ...

  5. Ignatius and the Princess III --undo

    Ignatius and the Princess III Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (J ...

  6. XML解析器(TinyXML)的使用指南

    关于XML文件的解析方法的引导, 大家可以去试试这个工具(TinyXML) 1.首先下载TinyXML库的文件,这里给出链接,大家自己去下吧,记着要上国际http://prdownloads.sour ...

  7. 关于CCRect

    一直有一个误区,因为之前处理的公司引擎是屏幕坐标系 导致觉得CCRect的坐标起始值(x,y),习惯性的认为就是左上角的点. 但是,真正的x,y值,是跟x轴与y轴相对应的.

  8. linux file命令

    1. file 是检测文件类型的命令.2. 文件类型就文件组织的方式,通常不同的文件类型执行不同的标准.例如我们熟知的:txt , doc , xls , pdf ...3. file 命令的简单用法 ...

  9. window成员和document成员

    输出浏览器成员和DOM成员(以下为safari浏览器测试)(浏览器不同对象成员有差异) window成员 <script type="text/javascript"> ...

  10. Java:单例模式的七种写法(转载)

    第一种(懒汉,线程不安全): package Singleton; /** * @echo 2013-10-10 懒汉 线程不安全 */ public class Singleton1 { priva ...