博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程珠玑 求解最大字串和
阅读量:5147 次
发布时间:2019-06-13

本文共 1368 字,大约阅读时间需要 4 分钟。

编程珠玑8.4节讲扫描算法,我看了半天都没看明白,最后自己写了一遍,终于搞懂了,把它记下来,以免今后忘了。

首先,书上的算法是这样写的:

maxsofar = 0maxendinghere = 0for i=[0 n)	maxendinghere = max(maxendinghere + x[i], 0)	maxsofar = max(maxsofar, maxendinghere)

 

这个max so far和max ending here究竟表示什么呢?

先来看我写的程序的输出:

输入:{31, -41, 59, 26, -53, 58, 97, -93, -23, 84}

输出:

 

其中Accu就是maxsofar,而Max就是maxending。

原理是这样的:

我们把成为最大字串和的字串SubSeq看成两部分:

前一部分为整个字串和贡献的值要大于0。

后一部分不能减少前一部分的值。

比如:{59, 26, -53}是前一部分,而{58, 97}是后一半。

好,现在再来看算法:

每次将x[i]加到Accu上,看Accu是不是减小了;

如果是,就先暂时不要x[i],直到Accu比它达到过的最大值还要大,这时就可以把暂时不要的的所有x[..]加到字串中,因为它们对字串的贡献>0。

而Max记录的就是Accu达到过的最大值。

 

废话不多说了,直接上代码:

#include 
#include
#include
#include
int seq_start = 0;int seq_end = 0;int max_sum(int x[], int n){ int max = INT_MIN, temp_sum = 0; bool hasNewStart = true; printf("No Accu Max SPos EPos\tSubSeq\n"); for (int i = 0; i < n; i++) { temp_sum += x[i]; if(temp_sum > max) { max = temp_sum; seq_end = i; if (hasNewStart) { seq_start = i; hasNewStart = false; } } else if (temp_sum < 0) { temp_sum = 0; hasNewStart = true; } char * tmp_str = arr2str((int *) &(x[seq_start]), seq_end - seq_start + 1); printf("%2d %4d %4d %3d %3d\t%s \n", i, temp_sum, max, seq_start, seq_end, tmp_str); delete [] tmp_str; } return max;}

转载于:https://www.cnblogs.com/autosar/archive/2012/04/14/2446934.html

你可能感兴趣的文章
Windows phone 8.1布局控件
查看>>
easyui中表格列之间的换位05
查看>>
SSL-ZYC 采购特价商品【SPFA】
查看>>
软工作业 2:时事点评-红芯浏览器事件
查看>>
网页里动态加载js
查看>>
https://tieba.baidu.com/p/2248070024
查看>>
eclipse 怎么查看相关引用
查看>>
pprint模块介绍
查看>>
命令行查看端口
查看>>
Vim复制一整行和复制多行
查看>>
时光穿梭机
查看>>
NVIDIA GRID 和 NICE DCV 技术用于实现 Linux 和 Windows® 图形加速虚拟桌面
查看>>
codevs——T2488 绿豆蛙的归宿
查看>>
MSIL实用指南-闭包的生成和调用
查看>>
使用Roslyn脚本化C#代码,C#动态脚本实现方案
查看>>
JDK dump
查看>>
Jenkins-在windows上安装及其部署
查看>>
【推荐收藏】10个获取免费网页背景纹理的最佳网站
查看>>
素材锦囊:50套高质量的 PSD 素材免费下载《下篇》
查看>>
帮助你在 Photoshop 中轻松实现长阴影效果的工具
查看>>