免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3580 | 回复: 10
打印 上一主题 下一主题

算法题:最大子段和 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-30 11:41 |只看该作者 |倒序浏览
给定由n个整数组成的系列a1,a2,a3,...,an,求该序列的子段和的最大值。当所以整数均为负整数时定义最大子段和为0。
例如序列[-2,11,-4,13,-5,-2]的最大子段和为20.

论坛徽章:
0
2 [报告]
发表于 2009-03-30 12:01 |只看该作者
动态规划之
f(x)=max{data(x),f(x-1)+data(x)}
ans=max{f(x),for x in 1..n}
代码:

  1. data=input();
  2. f=[0]*(len(data)+1);
  3. for i in xrange(1,len(data)+1) :
  4.   f[i]=((f[i-1]+data[i-1])>data[i-1])and (f[i-1]+data[i-1])or data[i-1];
  5. print max(f);
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-03-30 12:26 |只看该作者
data=[-2,11,-4,13,-5,-2]
res=0
curr=0
for i in range(len(data)):
    curr=max(0,curr+data[i])
    res=max(res,curr)
print(res)
来晚了,附上代码

论坛徽章:
0
4 [报告]
发表于 2009-04-01 11:46 |只看该作者
好算法!学习了。

论坛徽章:
0
5 [报告]
发表于 2009-04-01 12:50 |只看该作者
import collections
a = [-2,11,-4,13,-5,-2]
dic = collections.defaultdict(list)

for i in range(len(a)):
    for j in range(len(a), i, -1):
        dic[sum(a[i:j])].append(a[i:j])

for k,v in dic.items():
    print k,'-',v

print 'the maximum subsegment is:'
lst = dic.keys()
print max(lst),'-',dic[max(lst)]

>pythonw -u "b.py"
2 - [[-4, 13, -5, -2]]
4 - [[-4, 13, -5]]
5 - [[-2, 11, -4]]
6 - [[13, -5, -2]]
7 - [[11, -4]]
8 - [[13, -5]]
9 - [[-2, 11], [-4, 13]]
11 - [[-2, 11, -4, 13, -5, -2], [11]]
13 - [[-2, 11, -4, 13, -5], [11, -4, 13, -5, -2], [13]]
15 - [[11, -4, 13, -5]]
18 - [[-2, 11, -4, 13]]
20 - [[11, -4, 13]]
-7 - [[-5, -2]]
-5 - [[-5]]
-4 - [[-4]]
-2 - [[-2], [-2]]
the maximum subsegment is:
20 - [[11, -4, 13]]
>Exit code: 0

论坛徽章:
0
6 [报告]
发表于 2009-04-01 12:53 |只看该作者
import collections
a = [-2,11,-4,13,-5,-2]
dic = collections.defaultdict(list)

for i in range(len(a)):
    for j in range(len(a), i, -1):
        dic[sum(a[i:j])].append(a[i:j])

for k,v in dic.items():
    print k,'-',v

print 'the maximum subsegment is:'
lst = dic.keys()
print max(lst),'-',dic[max(lst)]

>pythonw -u "b.py"
2 - [[-4, 13, -5, -2]]
4 - [[-4, 13, -5]]
5 - [[-2, 11, -4]]
6 - [[13, -5, -2]]
7 - [[11, -4]]
8 - [[13, -5]]
9 - [[-2, 11], [-4, 13]]
11 - [[-2, 11, -4, 13, -5, -2], [11]]
13 - [[-2, 11, -4, 13, -5], [11, -4, 13, -5, -2], [13]]
15 - [[11, -4, 13, -5]]
18 - [[-2, 11, -4, 13]]
20 - [[11, -4, 13]]
-7 - [[-5, -2]]
-5 - [[-5]]
-4 - [[-4]]
-2 - [[-2], [-2]]
the maximum subsegment is:
20 - [[11, -4, 13]]
>Exit code: 0

论坛徽章:
0
7 [报告]
发表于 2009-04-01 13:53 |只看该作者

回复 #3 daybreakcx 的帖子

这个算法好

论坛徽章:
0
8 [报告]
发表于 2009-04-01 13:55 |只看该作者
data=[-2,11,-4,13,-5,-2]
 
 result = 0
 sum = 0
0.upto(data.size-1) { |i|
   
    if sum>0
        sum+=data[i]
    else
        sum = data[i]
    end
    result = sum if sum>result

}
p result

论坛徽章:
0
9 [报告]
发表于 2009-04-01 15:03 |只看该作者
这个算法有很多种实现,复杂度不一样。采用动态规划复杂度为O(n),算法效率最高

论坛徽章:
0
10 [报告]
发表于 2009-04-01 15:11 |只看该作者

回复 #3 daybreakcx 的帖子

不太理解,,,慢慢学习。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP