Добавил(а) Вчитель
|
05.11.10 12:04 |
Динамічне програмування
Аналогічний приклад можна навести і на більш складніший числовий ряд чисел Фібоначі.
Задача 1. Хтось вмістив пару новонароджених кроликів в деякому місці, обгородженому з усіх боків стіною. Скільки пар кроликів народиться при цьому протягом року, якщо природа кроликів така, що кожний місяць, починаючи з третього місяця після свого народження, пара кроликів породжує іншу пару?
Спосіб 1
Кожне наступне знаходити як суму двох попередніх.
1 1 2 3 5 8 ...
k1 перше число
k2 друге число
k3:=k1+k2;
k1:=k2;
k2:=k3;
program pr4 (іnput,output);
uses crt;
var
k1,k2,k3,n:longіnt;
begіn
clrscr;
k1:=1;k2:=1;
for n:=3 to 12 do begіn
k3:=k1+k2;
k1:=k2;
k2:=k3;
end;
wrіte('n',k3);
end.
Спосіб 2
Використаємо рекурентну формулу чисел Фібоначі.
Кожне число Фібоначі знаходять за формулою:
n=12
program pr5;
const n=12;
var
f1,f2:real;
f:longіnt;
begіn
f1:=exp(n*ln((1+sqrt(5))/2));
f2:=(exp(n*ln(abs(1-sqrt(5))/2)));
іf odd(n) then f:=round(1/sqrt(5)*(f1-f2)) else f:=round(1/sqrt(5)*(f1+f2));
wrіteln(f);
end.
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
Приклади задач
2. Хтось вмістив пару новонароджених кроликів в деякому місці, обгородженому з всіх боків стіною. Скільки пар кроликів народиться при цьому протягом року, якщо природа кроликів така, що кожний місяць, починаючи з третього місяця після свого народження, пара кроликів породжує іншу пару?
3. Визначити кількість способів, якими можна піднятися сходами з кількістю сходинок N, якщо дозволяється підніматися по одній і через одну сходинку.
4. Визначити кількість способів, якими можна піднятися сходами з кількістю сходинок N, якщо дозволяється підніматися по одній, через одну та через дві сходинки.
5. Визначити кількість способів, якими можна прокласти залізницю заданої довжини L км, при наявності рейс довжиною 1,2,3 км.
Задача 6 «Зернинки»
Мишка збирає зернинки на шаховій дошці. Може рухатись вниз та вліво. Зібрати найбільше зернинок.
|
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
|
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1
|
|
2
|
1
|
0
|
8
|
4
|
1
|
4
|
9
|
6
|
1
|
|
2
|
3
|
3
|
12
|
16
|
17
|
20
|
30
|
36
|
2
|
|
6
|
2
|
5
|
7
|
3
|
2
|
10
|
1
|
3
|
2
|
|
8
|
10
|
15
|
22
|
25
|
27
|
37
|
37
|
40
|
3
|
|
2
|
8
|
6
|
6
|
6
|
6
|
8
|
5
|
8
|
3
|
|
10
|
17
|
24
|
30
|
35
|
41
|
49
|
55
|
62
|
4
|
|
5
|
9
|
5
|
9
|
6
|
6
|
4
|
6
|
9
|
4
|
|
15
|
26
|
31
|
41
|
47
|
53
|
57
|
63
|
72
|
5
|
|
7
|
4
|
6
|
7
|
3
|
5
|
8
|
4
|
1
|
5
|
|
21
|
30
|
38
|
48
|
51
|
58
|
66
|
71
|
73
|
6
|
|
2
|
5
|
4
|
9
|
4
|
5
|
5
|
4
|
10
|
6
|
|
24
|
35
|
41
|
56
|
60
|
66
|
72
|
75
|
85
|
7
|
|
4
|
3
|
8
|
1
|
0
|
6
|
6
|
9
|
4
|
7
|
|
28
|
39
|
49
|
58
|
61
|
71
|
77
|
87
|
91
|
8
|
|
4
|
3
|
7
|
8
|
8
|
9
|
5
|
9
|
1
|
8
|
|
32
|
42
|
57
|
65
|
74
|
83
|
89
|
98
|
99
|
9
|
|
2
|
5
|
2
|
2
|
2
|
1
|
6
|
7
|
6
|
9
|
|
34
|
47
|
59
|
68
|
76
|
84
|
95
|
105
|
110
|
10
|
|
10
|
1
|
6
|
2
|
10
|
7
|
4
|
5
|
3
|
10
|
|
44
|
48
|
65
|
69
|
86
|
93
|
99
|
110
|
113
|
Задача 7 «ПОДАРУНОК ДЛЯ МУДРОЇ СОВИ»
П'ятачок і Вінні-Пух зібрались до Мудрої Сови на день народження. Для подарунка вирішили назбирати букет польових ромашок. Ромашкове поле задане прямокутною матрицею M N, у клітинках якої записано кількість ромашок, що ростуть на відповідному клаптику поля. Будь-який клаптик поля містить хоча б одну ромашку.
П'ятачок і Вінні-Пух вміють ходити лише по горизонталі і вертикалі, при цьому, зробивши хід на схід, уже не можна буде потім ходити на захід і навпаки, а також, зробивши хід на північ не можна буде ходити на південь і навпаки. У початковий момент гості Мудрої Сови знаходяться в центральній клітинці поля.
Напишіть програму, що допоможе вказати напрямок руху: NW — північний захід, NE — північний схід, SW— південний захід, SE — південний схід, та визначте при цьому найбільшу можливу кількість ромашок у букеті.
Технічні умови:
У першому рядку вхідного текстового файла owl.dat записано через пропуск два цілих непарних числа: М і N (2<М, N<100).
У наступних М рядках записано по N чисел у кожному, розділених пропуском. Кожне з чисел не перевищує 10000.
Ваша програма повинна вивести у файл owl.sol напрямок руху у вигляді: NW — північний захід, NE — північний схід, SW — південний захід, SE — південний схід. Та через пропуск у відповідному рядку кількість ромашок. Якщо таких напрямків буде більше одного, то вивести всі від NW за годинниковою стрілкою.
Приклад 1.
owl.dat owl.sol
3 3 NE 7
1 2 З
3 2 1
1 1 1
Приклад 2.
owl.dat owl.sol
3 5 NW 7
1 2 1 2 1 NE 7
3 2 1 2 3 SE 7
1 1 3 1 1 SW 7
Алгоритм Флойда-Уоршелла
З алгоритму Дейкстри зрозуміло, що можна знайти найкоротшу відстань від заданої вершини графа до решти його вершин. А якщо ця інформація потрібна для будь-якої вершини графа? Найперша відповідь, яка спадає на думку: необхідно виконати алгоритм Дейкстри в циклі для всіх вершин графа. Питання лише в часі виконання такого алгоритму, оскільки його оцінка буде О(п3). Однак існує компактніший за записом алгоритм Флойда-Уоршелла, з яким ми зараз і ознайомимося.
Запишемо сам алгоритм:
1, Визначити вершину графа k = 1, через яку буде здійснюватися перерахунок відстані між вершинами і та j.
2. Визначити вершину і = 1. 3. Визначити вершину j = 1,
4. Якщо величина dj, k + dk,j менша за значення di,j ,то замінити значення di,j на di, k + dk,і . В іншому разі залишити значення di,j без змін.
5. Якщо j <= п, то перейти до наступної вершини j+ 1 і повернутися до п. 4.
6. Якщо i<= п, то перейти до наступної вершини і + 1 і повернутися до п. 3.
7. Якщо k<=n, то перейти до наступної вершини k + 1 і повернутися до п. 2,
8. Завершити алгоритм.
У результаті виконання алгоритму елементи di,j будуть містити найкоротшу відстань між відповідними вершинами графа і та j.
Реалізація алгоритму Флойда-Уоршелла мовою Pascal буде такою:
for k := 1 to n do
for і := 1 to n do
for j := 1 to n do
if d[i,k]+d[k,j]k]+d[k,j];
4
0 20 3 2
20 0 40 3
3 40 0 4
2 3 4 0
|
0 5 3 2
5 0 7 3
3 7 0 4
2 3 4 0
|
0 20 3 2
20 0 40 3
3 40 0 4
2 3 4 0
|
0 20 3 2
20 0 23 3
3 40 0 4
2 3 4 0
|
0 20 3 2
20 0 23 3
3 23 0 4
2 3 4 0
|
0 5 3 2
20 0 23 3
3 23 0 4
2 3 4 0
|
0 5 3 2
5 0 23 3
3 23 0 4
2 3 4 0
|
0 5 3 2
5 0 7 3
3 23 0 4
2 3 4 0
|
0 5 3 2
5 0 7 3
3 7 0 4
2 3 4 0
|
|
ЕТАПИ РОЗВ'ЯЗАННЯ ЗАДАЧ НА КОМП'ЮТЕРІ |
|
|
|
Добавил(а) Administrator
|
23.09.10 13:12 |
ЕТАПИ РОЗВ'ЯЗАННЯ ЗАДАЧ НА КОМП'ЮТЕРІ
Перш ніж одержати очікуваний результат роботи програми на комп'ютері, необхідно виконати досить багато копіткої підготовчої роботи.
1.Постановка задачі. Розв'язування будь-якої задачі починається з ЇЇ постановки, викладеної мовою чітко визначених математичних понять. На першому кроці необхідно добре уявити, в чому саме полягає дана задача, які необхідні початкові дані, яку інформацію вважати результатами розв'язання.
2. Побудова математичної моделі. Побудова математичної моделі алгоритму — дуже відповідальний етап. Не завжди умова сформульованої задачі містить в собі математичну формулу, яку можна застосувати для розробки алгоритму задачі, не завжди розв'язок задачі вдається одержати в явному вигляді, що зв'язує вхідні дані га результат. Для цього створюється інформаційна математична модель об'єкта, що вивчається. Вибір виду моделі залежить від інформаційної сутності об'єкта, а не від його фізичної природи. Тобто, настільки важливе прикладне значення задач, як однотипність методів, якими вони розв'язуються. Наприклад, логічні моделі використовуються як для моделювання словесних міркувань, так і для опису логічних схем автоматики. Розв'язуючи задачу про рух тіла під дією прикладених до нього сил, ми перш за все записуємо рівняння його руху на основі законів механіки. Проте, крім сили тяжіння, на тіло діє і сила опору повітря. Постає питання достовірності математичної моделі і реальної картини досліджуваного об'єкта. Іноді буває неможливо врахувати всі реальні фактори, що впливають на нього. Тому дуже важливим є вміння виділити серед усіх факторів головні і другорядні, щоб останніми можна було знехтувати. При цьому може скластися ситуація, коли наперед невідомо, якими саме факторами можна знехтувати, і тому може бути кілька математичних моделей, які описують один і той самий об'єкт з різним ступенем достовірності. Відповідність моделі реальному об'єкту перевіряється практикою, комп'ютерним експериментом. Критерій застосування практики дає можливість оцінити побудовану модель і уточнити її за необхідності. Чим достовірніше математична модель відображає реальні сторони об'єкта, тим точніші одержувані результати.
3. Побудова алгоритму. Наступним етапом є розробка алгоритму обробки інформації на основі побудованої математичної моделі. Тепер необхідно знайти спосіб розв'язування цієї задачі. Для цього можуть бути застосовані вже відомі методи, проведена їх оцінка, аналіз, відбір або розроблені нові методи. Наприклад, вибір методу розв'язування системи рівнянь, що описує дану математичну модель. Під час створення складних алгоритмів застосовується метод покрокової розробки. Сутність цього методу полягає в тому, що алгоритм розробляється «зверху донизу». На кожному етапі приймається невелика кількість рішень, що призводить до поступової деталізації, уточнення як виконуваної, так і інформаційної структури алгоритму. Такий підхід дозволяє розбити алгоритм на окремі частини — модулі, кожний з яких розв'язує свою самостійну підзадачу. Це дає можливість сконцентрувати зусилля на розв'язуванні кожної підзадачі, що реалізується у вигляді окремої процедури. Для кожного такого модуля визначаються свої методи реалізації алгоритму та структура даних, якими він оперує. Останнім етапом у методі покрокової розробки є об'єднання окремих незалежних модулів у єдине ціле. Для цього між модулями повинні бути встановлені зв'язки, тобто узгоджена передача інформації від одних модулів до інших: результати виконання одних модулів є вхідною інформацією для інших.
Якщо поставлена задача є складним завданням, то важливість розбиття алгоритму на окремі модулі неможливо переоцінити.
4. Вибір мови програмування. Алгоритм, призначений для виконання на комп'ютері, має бути записаний мовою програмування. Різноманітність існуючих мов програмування потребує від програміста реальної оцінки складності та характеру задачі. Тільки після цього він зможе здійснити оптимальний вибір мови програмування для реалізації поставленої задачі. Враховуючи можливість розбиття всього алгоритму на окремі модулі, для кожного з них вибір мови програмування можна здійснити окремо. Процес розробки програми, як і алгоритму, може здійснюватися за принципом «зверху донизу». Це дозволяє одержати добре структуровану програму, читання і розуміння якої значно полегшене.
5. Складання програми. Цей етап потребує лише знання вибраної мови програмування. Суть його полягає в тому, щоб на основі розроблених алгоритмів і структур даних створити програму для комп'ютера.
6. Компіляція програми. Переведення програми на машинну мову здійснюється за допомогою спеціальних програм — компіляторів. Однією з їх функцій є перевірка відсутності в програмі синтаксичних помилок. Не тіште себе надією, що ваша, навіть найпростіша, програма написана бездоганно. Серед програмістів побутує прислів'я: «Якщо програма не має помилок, це означає, що у вас поганий компілятор!!!»
7. Налагодження програми, контрольний прорахунок. Виправлення усіх синтаксичних помилок у програмі на попередньому етапі .зовсім не позбавляє вас від помилок іншого типу — змістовних, логічних. Вони з'являються під час помилкового трактування умови поставленої задачі, через недосконалість математичної моделі або недоліки у побудованому алгоритмі, що призводить до одержання помилкового результату. Такі помилки не можуть бути усунені на стадії компіляції, тому що для їх виявлення необхідна інформація про сутність самої задачі. Це може зробити лише сам розробник. Процес налагодження програми полягає втому, що готується система тестів, за допомогою якої перевіряється робота програми в різних можливих режимах. Кожний тест містить набір вхідних даних, для яких відомий результат. Для більшості програм виникає необхідність добору не одного, а серії тестів, щоби перевірити якнайбільше можливих ситуацій, які можуть виникнути в процесі роботи програми. Якщо для всіх тестів результати роботи програми збіглися з розрахунками, то можна вважати, що логічних помилок немає.
9. Експлуатація програми. Тепер програму можна тиражувати і пропонувати іншим користувачам, доповнивши її відповідною документацією для користувачів. Документація повинна містити опис виконуваної задачі, опис середовища, в якому може працювати програма, обмеження на вхідні дані, формат вхідних та вихідних даних. Більшість розглянутих етапів розв'язування задач на комп'ютері виконуються людиною і носять творчий, евристичний характер.
Караванова Т.П., Основи алгоритмізації та програмування. 750 задач з рекомендаціями та прикладами (посібник)
|
|
Двійкові числа. Бінарні дерева |
|
|
|
Добавил(а) Гісь Ігор Володимирович
|
30.09.10 08:29 |
1. Розв'язуйте задачу Binary :
- превести число в двійкове
- зсунути масив цифр з кінця a[i+1]:=a[i]; та зациклити a[1]:=a[n+1];
- перевести число в десяткове
- визначити максимальне
- робити то повтору числа
2. Знайдіть інформацію про дерева та алгоритм рекурсивного обходу дерева
|
Последнее обновление 08.11.10 09:37 |
Готуємось до олімпіади з інформатики |
|
|
|
Добавил(а) Administrator
|
23.09.10 13:10 |
Готуємось до олімпіади з інформатики
1. Що таке олімпіадна інформатика?
Що потрібне для успішної участі в олімпіадах по інформатиці? Як показує практика, тільки знання мови програмування для цього явно не достатньо. Взагалі, виявляється, що олімпіадні задачі по інформатиці лежать десь на стику математики і програмування. І дуже часто виявляється, що розв’язуючи задачі школярі не тільки вчаться програмувати, але і освоюють нові розділи математики.
Для успішної участі в олімпіаді по програмуванню школяр повинен не тільки володіти мовою програмування, але і уміти придумувати і реалізовувати алгоритми розв’язку задач, оцінювати час їх роботи, тестувати і налаштовувати свої програми.
Перші олімпіади 1934 рік. Олімпіади з інформатики насправді дуже відрізняються від олімпіад з інших предметів:
- По-перше, всі учасники (і 8, і 11 класи) розв’язують одні і ті ж задачі (як правило – 3-4)
- По-друге, журі ніколи не дивиться тексти програм. існує певний набір тестів, за якими і перевіряють кожну задачу даного учасника. Правильний результат оцінюється в певне число балів. Виходячи з суми балів учасника і визначається результат.
Якщо з вивченням мови програмування у вас не повинно виникнути складнощів (величезна кількість книг по цій темі), то ось з алгоритмами доведеться складніше. Книг по цій темі теж немало, але вони, частіше всього, дуже переобтяжені теорією, а на олімпіадах потрібна тільки практика. З електронних джерел по алгоритмах можу порадити книгу С.М.Окулова і сайт algolist.manual.ru , який менш націлений на вивчення "олімпіадної інформатики", ніж книга Окулова, але містить велику кількість алгоритмів, яких немає в книзі, але які було непогано б знати.
Звикайте працювати в режимі: написання + відладка на Borland Pascal/Borland C++. Нові 32-бітові компілятори не мають жорсткого обмеження в пам'яті і працюють істотно швидше (особливо помітна різниця в швидкості виконання 16 і 32-бітових програм на P4). Така хитра тактика пояснюється відсутністю пристойного відладчика в нових платформах і їх практично повною сумісністю з компіляторами фірми Borland.
2. Як перевіряються розв’язки задач олімпіади
Історично склалося так, що розв’язки на олімпіадах по програмуванню перевіряються автоматично. Ваше завдання написати програму, яка за заданими вхідними даними обчислює і виводить вихідні дані.
Програма повинна виводити відповідь строго в описаному в умові форматі (тобто, наприклад, якщо програма раптом виведе у відповідь два числа в переплутаному порядку або замість числа-відповіді надумає написати слово "відповідь" і потім вже сама відповідь, перевіряючим комп'ютером це буде сприйнято як повністю неправильний розв’язок - він не зможе, та і не намагатиметься шукати, а в чому ж ви помилилися).
Другий наслідок з автоматичної перевірки - як правило, тести по задачі складаються так, щоб "покрити" всі можливі випадки. У тому числі і максимальні. Тобто якщо, наприклад, в умові написано, що "у вхідному файлі записано N чисел і N не перевищує 1000", то тест на N=1000 (або дуже близьке до нього число) майже напевно буде.
Ще одна традиція олімпіадних задач, коректність вхідних даних. Тобто, якщо це особливо не написано в умові, не вимагається перевіряти коректність вхідних даних - вхідні дані повністю відповідатимуть описаному в умові формату і задовольнятимуть всім вказаним обмеженням.
Ваш розв’язок повинний читати вхідні дані з вхідного файлу (його ім'я звичайно вказано в умові задачі) в описаному форматі, розв’язати задачу, і виводити результат у вихідний файл (його ім'я теж звичайно вказується в умові). Програма повинна завжди завершуватися з кодом 0 (інакше тестуюча програма вважає, що в ході роботи відбулася помилці) - тобто командою halt(0); або просто дійти до кінця на Паскалі. |
|