Python: подсписок минимальной суммы целого числа

Проблема с Python: у меня так много проблем с тем, как подойти к этой программе. Может ли кто-нибудь помочь мне или, по крайней мере, дать мне подсказку о том, что спрашивает эта программа?

5.37 Напишите функцию mssl() (подсписок минимальной суммы), которая принимает на вход список целых чисел. Затем он вычисляет и возвращает сумму подсписка максимальной суммы входного списка. Подсписок максимальной суммы — это подсписок (срез) входного списка, в котором сумма записей наибольшая. Пустой подсписок определяется как сумма 0. Например, максимальная сумма подсписка списка.

[4, -2, -8, 5, -2, 7, 7, 2, -6, 5]
is [5, -2, 7, 7, 2] and the sum of its entries is 19.
>>> l = [4, -2, -8, 5, -2, 7, 7, 2, -6, 5]
>>> mssl(l)
19
>>> mssl([3,4,5])
12
>>> mssl([-2,-3,-5])
0

person AppDude27    schedule 25.02.2013    source источник
comment
На каком языке это должно быть?   -  person Jon Clements♦    schedule 25.02.2013
comment
Это должно быть на Python, у меня это было в заголовке.   -  person AppDude27    schedule 25.02.2013
comment
Ах-ха, так ты и сделал - надо же не забыть в какой-то момент надеть очки :)   -  person Jon Clements♦    schedule 25.02.2013


Ответы (1)


Во-первых, вас просят найти все возможные подсписки вашего списка. Учитывая, что ваш список [3,4,5], все возможные подсписки:

[]
[3]
[3,4]
[3,4,5]
[4]
[4,5]
[5]

Вы можете сделать это, используя вложенный цикл и нарезка:

l = your_list
for start in xrange(len(l)):
  for end in xrange(1, len(l)+1):
    current_sublist = l[start:end]

Далее вам нужно найти максимальную сумму любого из этих подсписков. Один из способов — создать локальную переменную, обновить ее в цикле, если сумма текущего подсписка больше любой суммы ранее. Давайте также обернем его в функцию:

def mssl(l):
  f = 0
  for start in xrange(len(l)):
    for end in xrange(1, len(l)+1):
      s = sum(l[start:end]) 
      if s > f: 
        f = s
  return f

Давайте проверим это:

print mssl([4, -2, -8, 5, -2, 7, 7, 2, -6, 5])
print mssl([3,4,5])
print mssl([-2,-3,-5])

Выход:

19
12
0

однострочный для хорошей меры:

l = [4, -2, -8, 5, -2, 7, 7, 2, -6, 5]
max(sum(l[s:e]) for s in xrange(len(l)) for e in xrange(1, len(l)+1))
person sloth    schedule 25.02.2013