Задача 1. Коник-стрибунець, переміщуючись кроками або стрибками по
стовпчиках, збирає або втрачає монети на кожному зі стовпчиків
(відповідні числа у файлі konyk.txt). Знайти максимальну суму, яку він може зібрати.
Стратегія полягає у тому, щоб отримувати максимальну суму на кожному стовпці, обираючи одну із двох стратегій: стрибати на цей стовпець чи переходити.
Для набору з прикладу ([1, -2, 4, -2, -3, -5, -1, 5, 3, -4]) виграшною стратегією є 1, 3, 5, 7, 8, 9, а загальна сума, яку можна отримати =5.
Покроковий алгоритм:
Записуємо останній елемент стека у тимчасову змінну (піддаємо сумніву останній хід)
Розглядаємо дві суми – останнього та передостаннього елемента з поточним стовпчиком
Повертаємо у стек тимчасову змінну
Записуємо у стек кращу з двох сум пункту 2
# зчитування інформації з файлу
text=open('konyk.txt','r')
message = text.read()
# запис інформації у список
money=[]
for monety in message.split():
money.append(int(monety))
print(money)
# записуємо у стек перші два стовпці
stek=[]
stek.append(money[0])
stek.append(money[1])
# записуємо, звідки потрапили на перші два стовпці
konyk=[]
konyk.append(-1)
konyk.append(0)
# від третього (номер 2) і до останнього стовпця
for nomer in range(2,len(money)):
# тимчасово видаляємо зі стека останній елемент
temp=stek.pop()
# видаляємо ще один елемент і рахуємо суму з "передостаннього"
b=stek.pop()+money[nomer]
# рахуємо суму з "останнього"
a=temp+money[nomer]
# повертаємо тимчасово видалений елемент у стек
stek.append(temp)
# записуємо кращу суму та звідки потрапили на стовпець для такої суми
if a>b:
stek.append(a)
konyk.append(nomer-1)
else:
stek.append(b)
konyk.append(nomer-2)
# результат - останній елемент стеку
print(stek.pop())
print(konyk)
# з останнього стовпця (останній номер-1)
k=len(konyk)-1
# поки не дійдемо до першого стовпця, який позначили -1
while konyk[k]!=-1:
# друкуємо елемент (номер+1 для зручності)
print(konyk[k]+1)
# переходимо до елемента, з якого потрапили на цей стовпець
k=konyk[k]
Задача 2. Черепашка. Дано файл,
у якому записані монети, які може зібрати на своєму шляху черепашка,
котра вміє рухатись лише праворуч та вниз. Знайти оптимальний маршрут
черепашки, яка має дістатись у правий нижній кут поля.
Принцип розв'язання залишається схожим. Створимо двовимірний список, у якому будемо фіксувати суми, накопичені під час проходження черепашкою поля. В окремий список заносимо відомості про те, з якого напрямку опинились у поточній клітинці.
Для поданого прикладу за позначеним маршрутом черепашка може отримати 96 монет, рухаючись вниз, вниз, вниз, вправо, вправо, вниз, вправо, вправо.
# матриця зберігається у файлі cherepaha.txt text=open('cherepaha.txt','r') # board - матриця з файлу (рядків) board = [] # n кількість елементів n=int(text.readline()) # зчитування матриці for ryadok in text.readlines(): board.append(ryadok.split())
# поле черепашки (чисел) pole=[[0 for x in range(n)] for x in range(n)] # для кожного рядка списку суміжності k=0 for ryadok in board: # для кожного елемента рядка m=0 for element in ryadok: # записуємо ціле число на поле pole[k][m]=int(element) m=m+1 k=k+1
# сума, одержана на цей момент gold=[[0 for x in range(n)] for x in range(n)] gold[0][0]=pole[0][0]
# маршрут черепашки che=[[0 for x in range(n)] for x in range(n)] che[0][0]=0
# перебираємо всі рядки та стовпці for i in range(n): for j in range(n): # рухаємось вниз до i+1 (тобто з клітинки i-1) gold[i][j]=gold[i-1][j]+pole[i][j] che[i][j]=1 # перевірка, чи не краще було би пройти вправо if gold [i-1][j] + pole [i][j] < gold [i][j-1] + pole[i][j]: # рухаємось вправо gold [i][j]= gold [i][j-1] + pole[i][j] che[i][j]=2
# друк вмісту останньої клітинки - накопичена сума print(gold[4][4])
# друк маршруту - з останньої клітинки i= 4 j= 4 # поки не дійдемо до першої while (i > 0) or (j > 0): # якщо в клітинці стоїть 2, то потрапили сюди, рухаючись вправо if che[i][j] == 2 : print('вправо',gold[i][j]) # переходимо до клітинки ліворуч j=j-1 # інакше - потрапили рухаючись вниз else: print('вниз ',gold[i][j]) # переходимо до клітинки вище i=i-1
Завдання: вивести шлях не з кінця, а з початку
Задача 3. Порахувати, скільки способів потрапити з точки А в точку Б (якщо це взагалі можливо)