Форум сайта python.su
0
Доброго времени суток!
Такая задачка:
Генерируется ряд чисел (сколько их - задает пользователь). Они ненулевые, кроме крайних. Они “0”. Пройтись надо так, чтобы сумма тех, на которые мы “наступили” была максимальной. Ходить можно на след и послеслед число.
import random n = input(u'Введите число уровней: ') numbers = [0] while True: number = random.randint(-50, 50) numbers.append(number) if number == 0: continue if len(numbers) > n-2: break numbers.append(0) for i in numbers: print i
Отредактировано Adastraz (Июнь 4, 2013 20:34:40)
Офлайн
63
AdastrazЧто далее? Что дальше сравнивается? Результат предыдущего сравнения и х(4) или опять х(1) и х(2) но уже с х(4)? Сумбурно, очень сумбурно.
и так далее
Офлайн
0
Согласен, что сумбурно 
Ряд: 0, 1, -2, 3, 4 ,-5 ,0
Берем первые два числа (0, 1) и к ним поочередно прибавляем след. цифру (-2) и смотрим, куда нам выгоднее ее прибавить, чтобы в конце таких мелких задачек по ходу ряда, получить максимальную сумму. Динамическое программирование, полагаю. Важно, чтобы алгоритм был не жадным.
Итак, два числа:
1) 0
2) 1
Третье - 2. Выгоднее сделать:
1) 0
2) 1
3) 1 - 2 = -1
Так как ходить можно на число вперед и на послеслед. число, то 0 можно отбросить.
Получается так:
2) 1
3) -1
На очереди число 3. Выгоднее так:
2) 1
3) -2
4) 1 + 3 = 4
Число 2) отбрасываем по причине, которую я уже описал.
Ряд:
3) -2
4) 4
След. число - 4
3) -2
4) 4
5) 8
Число -5
4) 4
5) 8
6) 3
Число 0 в расчет не берем 
Итого, если пройтись по данному ряду, ступая только на след и послеслед число, максимальную сумму, которую можно получить - 8
Надеюсь, понятно 
Офлайн
63
Алгоритм ясен. Что должна выдавать программа? Максимальную сумму? Выбранные шаги? Индексы шагов, которые приводят к максиальной сумме? Можно это все, но не хочется писать лишний код :)
Отредактировано 4kpt (Июнь 7, 2013 01:22:38)
Офлайн
0
Сумму
Офлайн
t = [0, 1, -2, 3, 4, -5, 0] end_index = len(t) - 2 for i in xrange(3, end_index+1): if i == end_index: m = max(m, t[i-1]) else: m = max(t[i-1], t[i-2]) + t[i] t[i] = m print(m)
Офлайн
0
dimy44Спасибо. Почти так
import random n = input(u'Введите число уровней лестницы: ') numbers = [0] while True: number = random.randint(-50, 50) if number == 0: continue if len(numbers) > n-2: break numbers.append(number) numbers.append(0) for i in numbers: print i
Офлайн
Тогда так
def foo(lst): lenght = len(lst) assert lenght >= 3 if lenght == 3: return max((0, lst[1])) for i in xrange(lenght-3): m = max(lst[i], lst[i+1]) + lst[i+2] lst[i+2] = m return m print(foo([0, -28, 9, 36, 10, 0]))
Офлайн
0
Еще ближе 
Но при кол-ве чисел = 4 считает через раз правильно
Введите число уровней лестницы: 4 0 21 7 0 28 >>> ================================ RESTART ================================ >>> Введите число уровней лестницы: 4 0 -41 -3 0 -3 >>> ================================ RESTART ================================ >>> Введите число уровней лестницы: 4 0 -24 -49 0 -49
Офлайн
замените lenght-3 на lenght-2 в for i in …
Отредактировано dimy44 (Июнь 8, 2013 08:33:46)
Офлайн