СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Решение олимпиадных задач. Динамическое программирование

Категория: Информатика

Нажмите, чтобы узнать подробности

Делала мастер-класс в Г. Севастополь на тему "Решение задач школьного и муниципального Этапов ВсОШ", однако, понимая, что тема слишком обширна, помимо основных аспектов, необходимых для того, чтобы подготовить успешного участника ВсОШ по информатике, был разобран один конкретный метод решения задач, а именно динамическое программирование: в чем идея, пример реализации. 

Материалы включают в себя:

- презентация, может быть использована и для уроков с детьми, и для обучения учителей;

- раздаточный материал, который каждый участвующий мог использовать во время мероприятия, а потом смог забрать с собой;

- текст заготовки для решения разбираемой задачи, где есть самое необходимое, которая достаточно быстро модифицируется для получения решения. 

В качестве примера разбиралась задача с сайта acmp.ru. По задумке, любой желающий мог проверить свою программу в тестовой системе. 

Просмотр содержимого документа
«Раздаточный материал»

Просмотр содержимого презентации
«reshenie_zadach_olimpiad_last»

решениЕ задач школьного и муниципального Этапов В с ОШ Педагог ДО Шахова Е.А. ГБОУ ДО города Севастополя ЦДО «Малая академия наук» Севастополь, 2018

решениЕ задач школьного и

муниципального

Этапов В с ОШ

Педагог ДО Шахова Е.А.

ГБОУ ДО города Севастополя ЦДО «Малая академия наук»

Севастополь, 2018

Подготовка участников олимпиад выявление; привлечение к изучению языков программирования; по возможности организация подготовки  на уроках или факультативов; информационная и  ресурсная поддержка  педагогов.

Подготовка участников олимпиад

  • выявление;
  • привлечение к изучению языков программирования;
  • по возможности организация подготовки на уроках или факультативов;
  • информационная и

ресурсная поддержка

педагогов.

Что нужно знать?

Что нужно знать?

  • язык программирования ВУ (С++, Pascal, Python, Java);
  • базовые алгоритмы (алгоритмические структуры, работа с массивами, структуры данных);
  • специальные алгоритмы и методы.
Базовые знания и умения

Базовые знания и умения

  • свойства кратности, делимости чисел;
  • обработка последовательностей данных без массивов;
  • обработка массивов;
  • записи, векторы, списки и т.д.;
  • понятие сложности алгоритма.
Специальные алгоритмы

Специальные алгоритмы

  • динамическое программирование;
  • длинная арифметика;
  • «жадные» алгоритмы;
  • решение геометрических задач;
  • теория графов;
  • рекурсия и перебор;
  • комбинаторные задачи;
  • структуры данных.
Динамическое программирование Динамическое программирование  — метод решения задачи путём её разбиения на несколько одинаковых подзадач, рекуррентно связанных между собой. ЗАДАЧА X n ЗАДАЧА X n-1 ЗАДАЧА X n-1

Динамическое программирование

Динамическое программирование  — метод решения задачи путём её разбиения на несколько одинаковых подзадач, рекуррентно связанных между собой.

ЗАДАЧА X n

ЗАДАЧА X n-1

ЗАДАЧА X n-1

1. Рекурсивное решение: function F(n:integer):integer ; begin if (n else F:= F(n - 1) + F(n - 2); end;" width="640"

Рекуррентные соотношения

Последовательность Фибоначчи  F n  задается формулами: 

F 1  = 1,  F 2  = 1,  F n  =  F n  – 1  +  F n  – 2  при  n   1.

Рекурсивное решение:

function F(n:integer):integer ;

begin

if (n

else F:= F(n - 1) + F(n - 2);

end;

Задача про лестницу Вова стоит перед лесенкой из N ступеней. На каждой из ступеней написаны произвольные целые числа. Первым шагом Вова может перейти на первую ступень или, перепрыгнув через первую, сразу оказаться на второй. Также он поступает и дальше, пока не достигнет N-ой ступени. Посчитаем сумму всех чисел, написанных на ступенях через которые прошел Вова. Требуется написать программу, которая определит оптимальный маршрут Вовы, при котором, шагая, он получит наибольшую сумму. 1 -1 1

Задача про лестницу

Вова стоит перед лесенкой из N ступеней. На каждой из ступеней написаны произвольные целые числа. Первым шагом Вова может перейти на первую ступень или, перепрыгнув через первую, сразу оказаться на второй. Также он поступает и дальше, пока не достигнет N-ой ступени. Посчитаем сумму всех чисел, написанных на ступенях через которые прошел Вова.

Требуется написать программу, которая

определит оптимальный маршрут Вовы,

при котором, шагая, он получит

наибольшую сумму.

1

-1

1

Математическая модель Пусть a i – число, написанное на ступеньке № i, а S i – максимальная сумма, которую можно получить, дойдя до i-той ступеньки.    Допустим, нам известны все S i при   i? S N S N =max{S N-1 , S N-2 }+ a N ! S N-1 S 1 = a 1 S 2 = max{0, a 1 }+ a 2  S N-2

Математическая модель

Пусть a i – число, написанное на ступеньке № i, а S i – максимальная сумма, которую можно получить, дойдя до i-той ступеньки.

Допустим, нам известны все S i при i

?

S N

S N =max{S N-1 , S N-2 }+ a N

!

S N-1

S 1 = a 1 S 2 = max{0, a 1 }+ a 2

S N-2

Пример решения i 1 a 2 S 1 3 2 4 -2 5 -3 6 -2 7 4 2 8 1 1 3 1 0 -1 4 6 7 ? Как определить оптимальный путь? Вариант 1: Запоминать номера ступенек, с которых выгоднее ступать. Вариант 2: По значениям S вычислить номера ступенек, с которых поднимались, получив данное значение. !

Пример решения

i

1

a

2

S

1

3

2

4

-2

5

-3

6

-2

7

4

2

8

1

1

3

1

0

-1

4

6

7

?

Как определить оптимальный путь?

Вариант 1: Запоминать номера ступенек, с которых выгоднее ступать.

Вариант 2: По значениям S вычислить номера ступенек, с которых поднимались, получив данное значение.

!

1 Вариант i 1 a 2 1 S 3 2 № 4 -2 5 -3 6 -2 7 4 2 8 1 3 7 1 7 6 1 4 -1 1 4 6 3 2 0 0 2 8 7 6 4 2 1  1 2 4 6 7 8 !

1 Вариант

i

1

a

2

1

S

3

2

4

-2

5

-3

6

-2

7

4

2

8

1

3

7

1

7

6

1

4

-1

1

4

6

3

2

0

0

2

8 7 6 4 2 1  1 2 4 6 7 8

!

2 вариант (обратный проход) i 1 a 1 S 2 1 3 2 3 4 -2 5 1 -3 -2 6 0 7 -1 4 2 8 4 6 1 7 0 1 2 4 6 7 S i-1 S i -a i S i-2

2 вариант (обратный проход)

i

1

a

1

S

2

1

3

2

3

4

-2

5

1

-3

-2

6

0

7

-1

4

2

8

4

6

1

7

0

1

2

4

6

7

S i-1

S i -a i

S i-2

Программная реализация var  N, I, j : integer;  a : array[1..1000] of integer;// числа на ступеньках  S : array[0..1000] of longint; // суммы чисел  k : array[1..1000] of integer; //номера ступенек Begin  {ввод данных: N и массив a}  {заполнения массива S}  {обратный ход, заполнение массива k}  {вывод результата} end.

Программная реализация

var N, I, j : integer;

a : array[1..1000] of integer;// числа на ступеньках

S : array[0..1000] of longint; // суммы чисел

k : array[1..1000] of integer; //номера ступенек

Begin

{ввод данных: N и массив a}

{заполнения массива S}

{обратный ход, заполнение массива k}

{вывод результата}

end.

s[i-2] then // определяем максимум s[i]:=a[i]+s[i-1] else s[i]:=a[i]+s[i-2] end;" width="640"

Прямой ход

s[0]:=0; s[1]:=a[1]; // инициализация

for i:=2 to n do

begin

if s[i-1]s[i-2] then // определяем максимум

s[i]:=a[i]+s[i-1]

else

s[i]:=a[i]+s[i-2]

end;

Обратный ход i:=N; // начинаем с последней ступени, j:=1; k[1]:=N; // запоминаем ее в массив  while i0 do // пока не спустимся с лестницы  begin  inc(j);  if s[i]-a[i]=s[i-1] then // пришли с (i-1)-й ступени  k[j]:=i-1  else k[j]:=i-2; // пришли с (i-2)-й ступени  i:=k[j]; // переходим на другую ступень  end;

Обратный ход

i:=N; // начинаем с последней ступени,

j:=1; k[1]:=N; // запоминаем ее в массив

while i0 do // пока не спустимся с лестницы

begin

inc(j);

if s[i]-a[i]=s[i-1] then // пришли с (i-1)-й ступени

k[j]:=i-1

else k[j]:=i-2; // пришли с (i-2)-й ступени

i:=k[j]; // переходим на другую ступень

end;

Примеры задач на динамическое программирование ЕГЭ №15 На рисунке – схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, И, К. По каждой дороге можно двигаться только в одном направлении, указанном стрелкой. Сколько существует различных путей из города А в город К?

Примеры задач на динамическое программирование

ЕГЭ №15

На рисунке – схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, И, К. По каждой дороге можно двигаться только в одном направлении, указанном стрелкой. Сколько существует различных путей из города А в город К?

Примеры задач на динамическое программирование ЕГЭ №22 У исполнителя Калькулятор две команды, которым присвоены номера: 1. прибавь 1 2. умножь на 2 Сколько есть программ, которые число 1 преобразуют в число 16?

Примеры задач на динамическое программирование

ЕГЭ №22

У исполнителя Калькулятор две команды, которым присвоены номера:

  • 1. прибавь 1
  • 2. умножь на 2

Сколько есть программ, которые число 1 преобразуют в число 16?

Примеры задач на динамическое программирование При переработке радиоактивных материалов образуются отходы двух видов — особо опасные (тип A) и неопасные (тип B). Для их хранения используются одинаковые контейнеры. После помещения отходов в контейнеры последние укладываются вертикальной стопкой. Стопка считается взрывоопасной, если в ней подряд идет более одного контейнера типа A. Стопка считается безопасной, если она не является взрывоопасной. Для заданного количества контейнеров N определить количество возможных типов безопасных стопок.

Примеры задач на динамическое программирование

При переработке радиоактивных материалов образуются отходы двух видов — особо опасные (тип A) и неопасные (тип B). Для их хранения используются одинаковые контейнеры. После помещения отходов в контейнеры последние укладываются вертикальной стопкой. Стопка считается взрывоопасной, если в ней подряд идет более одного контейнера типа A. Стопка считается безопасной, если она не является взрывоопасной.

Для заданного количества контейнеров N определить количество возможных типов безопасных стопок.

Примеры задач на динамическое программирование В каждой клетке прямоугольной таблицы N*M записано некоторое число. Изначально игрок находится в левой верхней клетке. За один ход ему разрешается перемещаться в соседнюю клетку либо вправо, либо вниз (влево и вверх перемещаться запрещено). При проходе через клетку с игрока берут столько килограммов еды, какое число записано в этой клетке (еду берут также за первую и последнюю клетки его пути). Требуется найти минимальный вес еды в килограммах, отдав которую игрок может попасть в правый нижний угол.

Примеры задач на динамическое программирование

В каждой клетке прямоугольной таблицы N*M записано некоторое число. Изначально игрок находится в левой верхней клетке. За один ход ему разрешается перемещаться в соседнюю клетку либо вправо, либо вниз (влево и вверх перемещаться запрещено). При проходе через клетку с игрока берут столько килограммов еды, какое число записано в этой клетке (еду берут также за первую и последнюю клетки его пути).

Требуется найти минимальный вес еды в килограммах, отдав которую игрок может попасть в правый нижний угол.

Список использованных источников

Список использованных источников

  • Материалы сайта Полякова К.Ю по подготовке к ЕГЭ http://kpolyakov.spb.ru/school/ege.htm.
  • Сайт «Школа программирования» - ACMP.ru
  • Динамическое программирование для начинающих. - https ://tproger.ru/articles/dynprog-starters /
  • Казимиров А., Динамическое программирование. Классические задачи . - https://habr.com/post/113108/