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

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

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

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

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

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

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

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

Итоги урока

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

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

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

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

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

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

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

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

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

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

Решение задач школьного и муниципального этапов ВсОШ

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

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



Лесенка-2

(Время: 1 сек. Память: 16 Мб Сложность: 37%)

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

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

Входные данные

Входной файл INPUT.TXT содержит в первой строке натуральное число N – количество ступеней лестницы (2 ≤ N ≤ 1000). Во второй строке через пробел заданы числа, написанные на ступенях лестницы, начиная с первой. Числа, написанные на ступенях, не превосходят по модулю 1000.

Выходные данные

Выходной файл OUTPUT.TXT должен содержать в первой строке наибольшее значение суммы. Во второй строке должны быть записаны через пробел номера ступеней по возрастанию, по которым должен шагать Вова. Если существует несколько различных правильных маршрутов, то можно вывести любой из них.

Примеры

INPUT.TXT

OUTPUT.TXT

1

3

1 2 1

4

1 2 3

2

3

1 -1 1

2

1 3



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

Допустим, нам известны все Si при iN?

SN=max{SN-1, SN-2}+ aN

S1= a1, S2= max{0, a1}+ a2

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

i

1

2

3

4

5

6

7

8

a

1

2

-2

-3

-2

4

2

1

S

1

3

1

0

-1

4

6

7

Обратный ход: 8, 7, 6,4,2,1.

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

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[0]:=0;

s[1]:=a[1];

for i:=2 to n do

begin

s[i]:=a[i];

if s[i-1]s[i-2] then

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

else

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

end;



Обратный ход

j:=1;

k[1]:=N;

i:=N;

while i0 do

begin

inc(j);

if s[i]-a[i]=s[i-1] then

k[j]:=i-1

else k[j]:=i-2;

i:=k[j];

end;



Задача №329 «Лесенка-2»

https://acmp.ru/index.asp?main=task&id_task=329

Просмотр содержимого презентации
«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/


Скачать

Рекомендуем курсы ПК и ППК для учителей

Вебинар для учителей

Свидетельство об участии БЕСПЛАТНО!