Реферат: Динамическое программирование, алгоритмы на графах - текст реферата. Скачать бесплатно.
Банк рефератов, курсовых и дипломных работ. Много и бесплатно. # | Правила оформления работ | Добавить в избранное
 
 
   
Меню Меню Меню Меню Меню
   
Napishem.com Napishem.com Napishem.com

Реферат

Динамическое программирование, алгоритмы на графах

Банк рефератов / Информатика, информационные технологии

Рубрики  Рубрики реферат банка

закрыть
Категория: Реферат
Язык реферата: Русский
Дата добавления:   
 
Скачать
Архив Zip, 46 kb, скачать бесплатно
Заказать
Узнать стоимость написания уникального реферата

Узнайте стоимость написания уникальной работы

Реферат Динамическое программирование, алгоритм ы на графах Содержание Введен ие 1. Алгоритмы, использующие решение дополнительных подзадач 2. Основные определения теории графов 3. Поиск пути между парой вершин невзвешенного графа 4. Пути минимальной длины во взвешенном графе Заключение Литература Введение Существует целый класс задач по программи рованию, которые проще решаются, если ученик владеет определенным набор ом знаний, умений и навыков в области алгоритмов на графах. Это происходи т потому, что такие задачи могут быть переформулированы в терминах теори и графов. Теория графов содержит огромное количест во определений, теорем и алгоритмов. И поэтому данный материал не может п ретендовать, и не претендует, на полноту охвата материала. Однако, по мнен ию автора, предлагаемые сведения являются хорошим компромиссом между о бъемом материала и его "коэффициентом полезного действия" в практическо м программировании и решении олимпиадных задач. Иногда решение основной задачи приходитс я формулировать в терминах несколько модифицированных подзадач. Именн о такие проблемы рассматриваются в данной работе. 1 . Алгоритмы, использующ ие решение дополнительных подзадач Задача 9 . Тр ебуется подсчитать количество различных разбиений числа N на натуральные сл агаемые. Два разложения считаются различными, если одно нельзя получить из другого путем перестановки слагаемых. Решение. Д ля того чтобы подсчитать количество различных разбиений числа N на произвольные н атуральные слагаемые, предварительно подсчитаем количества разбиений на следующие группы слагаемых: 1) разбиения только на единицы (очевидно, чт о для любого числа такое разбиение единственно); 2) разбиения на единицы и двойки такие, что хотя бы одна двойка в разбиении присутствует и т.д. После днюю группу представляет само число N . Очевидно, что каждое разбиение числа N можно приписа ть только к одной из рассмотренных групп, в зависимости от значения j — максимальн ого слагаемого в том или ином разбиении. Обозначим количество разбиений в каждой из групп t ( N , j ). Тогда искомое количество разбиений равно сумме р азбиений по всем возможным группам. Введение таких подзадач приводит к н есложному способу подсчета числа разбиений. А именно, так как в любом из р азбиений j - ой группы присутствует число j , то мы можем вычесть из N число j и сложить разбиен ия уже числа N – j на слагаемые, не превосходящие j . То есть мы пришли к следующему рекуррентному соотношению: Теперь очевидно, что если мы имеем возможность завести двумерный массив размером N N , и будем заполнять его в порядке возрастания номеров строк, то задача будет легко решена. Од нако легко заметить, что решения части подзадач никак не участвуют в фор мировании решения. Например, при вычислении количества разбиений числа 10 на слагаемые будут получены, но не использованы значения t (9, j ) для j = 2..9 и т. д. Для того чт обы не производить лишних вычислений, применим динамическое программи рование “сверху вниз” (все предыдущие задачи решались “снизу вверх”). Дл я этого задачу будем решать все же рекурсивно, используя формулу (*), но отв еты к уже решенным подзадачам будем запоминать в таблице. Первоначально таблица пуста (вернее заполним элементы, значение которых по формуле ( ) равно 0 или 1, а остальные значения, например, числом -1). Когда в процессе вычислений подзадача встречается первый раз, ее реше ние заносится в таблицу. В дальнейшем решение этой подзадачи берется из таблицы. Таким образом мы получили прием улучшения рекурсивных алгорит мов, а “лишние” подзадачи теперь решаться не будут. Приведем программу для решения этой задачи. var i,j,k,n:byte; sum:longint; table:array[1..120,1..120] of longint; function t(n,k:byte):longint; var i,s:byte; begin if table[n,k]<0 then остальные элементы не пересчитываем begin table[n,k]:=0; for i:=1 to k do inc(table[n,k],t(n-k,i)) end; t:=table[n,k] end; begin read(n); fillchar(table,sizeof(table),0); for i:=1 to n do begin table[i,i]:=1; table[i,1]:=1 end; неопределенные элементы метим – 1 for i:=2 to n do for j:=2 to i-1 do table[i,j]:=-1; sum:=0; for i:=1 to n do sum:=sum+t(n,i); writeln('sum=',sum) end. Задача 10 . П литки ( Чемпионат школьников по программ ированию, Санкт-Петербург, 1999 г. ). У Пети имеется неограничен ный набор красных, синих и зеленых плиток размером 1 1. Он выбирает ровно N плиток и выкладывает их в полоску. Например, при N = 10 она может выгля деть следующим образом: К К К С З К К З К С (Буквой К обозначена красная плитка, С – син яя, З – зеленая) После этого Петя заполняет следующую таблицу, которая в данном примере выглядит так: Красный Синий Зеленый Красный Y Y Y Синий Y N Y Зеленый Y Y N В клетке на пересечении строки, отвечающей цвету А, и столбца, отвечающего цвету Б, он записывает "Y", если в его полоске найдется место, где рядом лежат плитки цветов А и Б и "N" в противном случае. Считается, что плитки лежат рядом, если у них есть общая сторона. (Очевидно , что таблица симметрична относительно главной диагонали – если плитки цветов А и Б лежали рядом, то рядом лежали и плитки цветов Б и А.) Назовем так ую таблицу диаграммой смежности данной полоски. Так, данная таблица представляет собой диаграмму смежности приведенно й выше полоски. Помогите Пете узнать, сколько различных полосок имеет определенную диа грамму смежности (заметьте, что полоски, являющиеся отражением друг друг а, но не совпадающие, считаются разными. Так, полоска С К З К К З С К К К не совпадает с полоской, приведенной в нача ле условия.) Первая строка входного файла содержит число N . ( ). Следующие три строки входного файла, содержащие по три символа из набора “Y”, “N” , со ответствуют трем строкам диаграммы смежности. Других символов, включая пробелы, во входном файле не содержится. Входные данные корректны, т.е. диа грамма смежности симметрична. Выведите в выходной файл количество полосок длины N , имеющих приведенную во входном файле диаграмму смежности. Ниже дан пример входного и выходно го файлов. Input.txt Output.txt 10 YYY YNY YYN 4596 Решение. О чевидно, что перебор всех возможных полосок в данной задаче невозможен, так как их количество может составить 2 100 , поэтому следует попытаться найти динами ческую схему решения. Понятно, что для того чтобы подсчитать количество полосок длины N , удовлетворяющих заданной диаграмме смежности, н еобходимо знать количество допустимых полосок длины N – 1, а также количе ство полосок, в диаграмме смежности которых один диагональный элемент и ли два симметричных недиагональных элемента равны “N” вместо “Y” в исходной диаграмме. Далее, при рассмот рении полосок длины N – 2, потребуется знать количество полосок, удовлетв оряющих еще большему количеству диаграмм смежности и т. д. В результате н а каком то шаге нам может понадобиться информация о количестве полосок п рактически со всеми возможными диаграммами. Общее количество последни х составляет 2 6 = 64 (уникальными, то есть не повторяющимися, а, значит, о пределяющими количество различных диаграмм, являются только 6 элементо в). Так как при увеличении длины полоски диаграмма может измениться в зав исимости от сочетания цветов в последнем (новом) и предпоследнем элемент ах, подсчитывать полоски следует отдельно для трех различных конечных э лементов. Таким образом количество хранимой информации возрастает до 64 3 = 192 значений. Столько же значений будет получено в рез ультате пересчета. Но благодаря тому, что количество полосок длины i выражается только через количество полосок длины i – 1, хранить нужно лишь эти 2 192 = 384 значения. Несмотря на малый размер таблицы (массив total в программе) следует отметить, что ее размер экспоненциально зависит от одного из входных пар аметров — количества цветов k , а именно: 2 k 2 k ( k +1)/2 . Например, для 8 цветов необходимо было бы хранить 2 40 элементов, ч то нереально. Этим данная задача отличается от рассмотренных ранее. Осталось обсудить некоторые технически е приемы, позволяющие написать довольно простую программу, реализующую описанный алгоритм. Если мы поставим в соответствие каждому из уникальн ых мест в диаграмме смежности свою степень двойки от 2 0 до 2 5 (см. массив констант magic в программе), то каждой диаграмме м ожет быть поставлен в соответствие номер от 0 до 63, равный сумме тех степен ей двоек, которые соответствуют значениям “Y” (см. процедуру findcode). Если мы по дсчитываем количество полосок для диаграммы с номером j , то совместимость доб авляемого цвета k стоявшему ранее последним цвету l согласно диаграмме j можно провери ть так: magic[k, l] and j <> 0. Данное условие, построенное с помощью битовой операции над целыми числами and, означает наличие в j- ой диаграмме смежности элемента “Y” на пересечен ии k -й строки и l -го столбца (со ответствующая степень двойки массива magic содержится в двоичном представ лении числа j ). Выражение j - magic[k, l] соответствует замене в диаграмме с номером j упомянутого элемента “Y” на “N” (по другому это выражение можно было бы записать как j xor magic[k, l]). Подроб нее о битовых операциях над целыми числами можно прочитать в [1]. Последний прием заключается в том, что мы не будем на каждом шаге переприсваивать п олученные значения элементам массива, предназначенного для хранения р езультатов предыдущего шага. Для этого результаты для полосок четной дл ины i будем пом ещать в половину массива total с первым индексом 0, а нечетные — с индексом 1. В любом из этих случаев значения предыдущего шага доступны по индексу [1 – i mod 2]. Кроме того, ответ на решение этой задачи при всех N , удовлетворяющих усло вию, требует самостоятельной организации вычислений с помощью так назы ваемой “длинной арифметики” (см., например, [1, 3]). Приведем программу для решения этой задачи, но использующую вместо “дли нной арифметики” тип данных extended , сохраняющий максимально возможное количество з начащих цифр (попробуйте модернизировать программу самостоятельно). То есть не для всех значений N ответ будет вычислен точно. Но, так как для получен ия результата используется только сложение целых чисел, потери точност и при промежуточных вычислениях не будет, по крайней мере пока ответ не с танет превышать 2 63 . $N+ const magic: array [1..3, 1..3] of byte = ((1, 2, 4), (2, 8, 16), (4, 16, 32)); var n,i,j,k,l,code: longint; can: array [1..3, 1..3] of boolean; total: array [0..1, 1..3, 0..63] of extended; answer: extended; procedure readdata; var s: string; i, j: byte; begin readln(n); fillchar(can, sizeof(can), false); for i : = 1 to 3 do begin readln(s); for j : = 1 to 3 do if upcase(s[j]) = 'Y' then begin can[i, j] : = true; can[i, j] : = true end end end; procedure findcode; var i, j: byte; begin переводим диаграмму смежности в число code : = 0; for i : = 1 to 3 do for j : = i to 3 do if can[i, j] then code : = code + magic[i, j] end; begin assign(input, 'input.txt'); reset(input); assign(output,'output.txt'); rewrite(output); readdata; findcode; fillchar(total, sizeof(total), 0); количество полосок длины 1 for i : = 1 to 3 do total[1, i, 0] : = 1; for i : = 2 to n do for j : = 0 to 63 do for k : = 1 to 3 do cчитаем полоски длины i, c диаграммой смежности j и оканчивающиеся цветом k begin total[i mod 2, k, j] : = 0; for l : = 1 to 3 do цикл по конечному цвету полосок длины i - 1 if magic[k, l] and j <> 0 then цвета l и k могут соседствовать согласно диаграмме смежности j begin total[i mod 2, k, j] : = total[i mod 2, k, j] + total[1 - i mod 2, l , j]; total[i mod 2, k, j] : = total[i mod 2, k, j] + total[1 - i mod 2, l , j - magic[k, l]] end end; answer : = 0; суммируем количество полосок с диаграммо й смежности code и различными окончаниями for i:=1 to 3 do answer:=answer + total[n mod 2, i, code]; writeln(answer:0:0) end. Похожая з адача (“Симпатичные узоры”) предлагалась и на I-ой Всероссийской командн ой олимпиаде по программированию. Ее условие и решение можно прочитать в [2]. Задача 11 . П аркет ( Задача VI Всероссийской олимпиады п о информатике, 1994 г. ) Комнату размером N M единиц требуется покрыть одинаковыми паркетными плитками размером 2 1 единицу без пропусков и наложений (1 N 20, 1 M 8). Требуется определить количество всех возможных способов укладки паркета для конкретных значений N и M . Решение. П усть M — ш ирина комнаты, которую мы зафиксируем. Попытаемся выразить искомое коли чество укладок паркета для комнаты длины N , через количество укладок для комнаты длиной N – 1. Однако очевидно, что сделать это не удастся, та к как существует еще множество укладок, в которых часть плиток пересекае т границу между такими комнатами. Следовательно нам опять придется реша ть дополнительное число подзадач. А именно, введем обобщенное понятие ук ладки комнаты длиной N – 1: первая часть комнаты длиной N – 2 уложена плотно , а в ( N – 1)-й единице измерения длины комнаты могут находиться пустоты (в N -й единице измерен ия паркета нет). Если наличие плитки в ( N – 1)-й единице измерения обозначить 1, а ее о тсутствие — 0, то количество различных окончаний подобных укладок можно пронумеровать двоичными числами от 0 до 2 M – 1. Если количес тво укладок для каждого из окончаний нам известно (часть из них могут ока заться нереализуемыми, то есть соответствующее количество укладок буд ет равно 0), то мы сможем подсчитать количество различных укладок комнаты длины N . Пр и этом придется проверять совместимость окончаний. Окончания будем счи тать совместимыми, если путем добавления целого числа плиток к укладе дл иной N – 1 с окончанием j , таких что каждая из них увеличивает длину укладки до N , мы мож ем получить окончание i укладки длиной N . Если способ совмещения укладок существу ет, то по построению он единственен. Тогда для определения количества ук ладок с окончанием i длиной N необходимо просуммировать количества укладок дл иной N – 1 с совместимыми окончаниями. Для комнаты нулевой длины будем считать коли чество укладок равным 1. Формирование динамической схемы закончено. Коли чество хранимых в программе значений при этом равно 2 2 M =2 M +1 , то есть оно эксп оненциально зависит от одного из параметров задачи и существенно его ув еличить не представляется возможным. В нашем случае оно равно 512, то есть п рименение табличного метода решения оказывается реальным. Ответ на воп рос задачи будет получен на N -м шаге алгоритма в элементе таблицы с номером 2 M – 1. При макс имальном по условию задачи размере комнаты для получения ответа опять п отребуется “длинная арифметика”. Схему программы для решения этой задачи, которая проще предыдущей, можно найти, например, в [3]. После рассмотрения задач 9-11 может сложиться впечатление, что к данному кл ассу относятся лишь задачи подсчета количеств тех или иных конфигураци й, в том числе комбинаторных. Конечно же это не так. Примером оптимизацион ной задачи, решение которой основано на аналогичных идеях, служит задача “Бизнес-классики”, предлагавшаяся на XIII Всероссийской олимпиаде по прог раммированию (см. [4]). Многие прикладные и олимпиадные задачи легко сформулировать в термина х такой структуры данных как граф. Для ряда подобных задач хорошо изучен ы эффективные (полиномиальные) алгоритмы их решения. Рассмотрим в данной лекции те из них, которые используют идеи динамического программирован ия. Но прежде необходимо познакомиться с некоторыми терминами, встречаю щимися при описании этой структуры. 2 . Основные определения теории графов Графом называ ется пара , где V – некоторое множе ство, которое называют множеством вершин графа, а E – отношение на V ( ) - множество ребер графа. То есть все ребра из множества E соединяют некот орые пары точек из V . Если отношение E симметричное (т.е. ), то граф наз ывают неориентированным , в противном случае граф называют ориентированным . Факт ически для каждого и з ребер ориентиро ванного графа указаны начало и конец, то есть пара ( u , v ) упорядоче на, а в неориентированном графе ( u , v ) = ( v , u ). Если в графе существует ребро ( u , v ), то говорят, что вершина v смежна с ве ршиной u (в ориентированном графе отношение смежности несимметрично). Путем из верш ины u в вершину v длиной k ребер называют пос ледовательность ребер графа . Часто тот ж е путь обозначают последовательностью вершин . Если д ля данных вершин u , v существует путь из u в v , то говорят, что вершин а v достижима из u . Путь называется простым , если все ве ршины в нем различны. Циклом называется путь, в котором начальная вершина совпад ает с конечной. При этом циклы, отличающиеся лишь номером начальной точк и, отождествляются. Граф называется связанным , если для люб ой пары его вершин существует путь из одной вершины в другую. Если каждому ребру графа приписано какое-то число ( вес ), то граф называют взвешенным . При программировании вершины графа обычно сопоставляют числам от 1 до N , где - количеств о вершин графа, и рассматривают . Ребра нуме рую числами от 1 до M , где . Для хранен ия графа в программе можно применить различные методы. Самым простым явл яется хранение матрицы смежности , т.е. двумерного массива, скажем A , где для невзвешенног о графа (или 1), ес ли и (или 0) в противном случае. Для взвешенного графа A [ i ][ j ] равно весу соответствующего ребра, а отсутствие ре бра в ряде задач удобно обозначать бесконечностью. Для неориентированн ых графов матрица смежности всегда симметрична относительно главной д иагонали ( i = j ). C помощью матр ицы смежности легко проверить, существует ли в графе ребро, соединяющее вершину i с вер шиной j . Основн ой же ее недостаток заключается в том, что матрица смежности требует, что бы объем памяти памяти был достаточен для хранения N 2 значений, даже если ребер в графе существенно меньш е, чем N 2 . Это не позволяет построить алгоритм со временем порядка O ( N ) для графов, имеющ их O ( N ) ребер. Этого недостатка лишены такие способы хранения графа, как одномерный ма ссив длины N сп исков или множеств вершин. В таком массиве каждый элемент соответствует одной из вершин и содержит список или множество вершин, смежных ей. Для реализации некоторых алгоритмов более удобным является описание г рафа путем перечисления его ребер. В этом случае хранить его можно в одно мерном массиве длиной M , каждый элемент которого содержит запись о номерах начальной и конечной вершин ребра, а также его весе в случае взвешенного графа. Наконец, при решении задач на графах, в том числе и с помощью компьютера, ч асто используется его графическое представление. Вершины графа изобра жают на плоскости в виде точек или маленьких кружков, а ребра — в виде лин ий (не обязательно прямых), соединяющих соответствующие пары вершин, для неориентированного графа и стрелок – для ориентированного (если ребро направлено из u в v , то из точки, изображающей вершину u , проводят стрелку в ве ршину v ). Графы широко используются в различных областях науки (в том числе в исто рии ! !!) и техники для моделирования отношений между объектами. Объекты соответствуют ве ршинам графа, а ребра — отношениям между объектами). Подробнее об этой ст руктуре данных можно прочитать в [5 - 7]. 3. Поиск пути между паро й вершин невзвешенного графа Пусть мы имеем произвольны й граф, ориентированный или неориентированный. Если в невзвешенном граф е существует путь, то назовем длиной пути количество ребер в нем. Если пут и нет вообще, то расстояние считается бесконечным. Путь минимальной длин ы при этом называется кратчайшим путем в графе. Легко показать, что любые части кратчай шего пути также являются кратчайшими путями между соответствующими ве ршинами. Ведь если это не так, то есть существует отрезок кратчайшего пут и, между концами которого можно построить более короткий путь, то мы може м заменить этот отрезок кратчайшего пути между вершинами u и v на более короткий, тем самым уменьшив и длину кратчайшего пути между u и v , что невозможно. Это св ойство кратчайших путей позволяет решать задачу их нахождения методом динамического программирования. Покажем сначала как можно записать “в олновой алгоритм” так, что задача поиска кратчайшего пути между двумя ве ршинами графа будет решаться за O ( N 2 ) действий. Задача 12 . Для линий метрополитена некоторого города из вестно, между какими парами линий есть пересадочная станция. Необходимо определить, за сколько пересадок можно добраться с линии m на линию n ил и сообщить, что сделать это невозможно. Решение. Такой метрополитен удобно описывать с помощь ю графа, вершины которого есть линии метрополитена (а не станции ! !!), а наличие ребра между вершинами i и j графа соответствует наличию пересадочной ст анции между линиями с номерами i и j . Представим этот граф с помощь массива множ еств (переменная ss в программе), в i -м элементе этого массива содержится множе ство всех линий, на которые можно попасть с линии i за одну пер есадку. Результат будем получать с помощью множества s, на каждом шаге алг оритма содержащего номера всех линий, на которые можно попасть с исходно й линии m за k пересадок. Заметим, что если вершина n нашего графа достижима из вершины m (говорят, что они находятся в одной компоненте связности ), то искомое число пересадок меньше общего кол ичества линий nn . Так как даже если после каждой из первых nn – 1 пер есадок мы попадали на новую линию, то после следующей пересадки мы обяза тельно окажемся на какой-то из линий повторно, ведь их всего nn . Поэтому, е сли наш алгоритм не завершился за nn – 1 шаг, то граф не связан и дальнейший поиск пути бесполезен (заметим, что наличие пути между двумя конкретными вершинами не доказывает его связность, а исследовать все пары вершин с п омощью предложенного алгоритма для анализа связности неэффективно). Программа для решения задачи представлена ниже. const nn=200; числ о линий type myset = set of 0..nn;var i,m,n,k:byte; ss:array[1..nn] of myset; s,s1:myset;begin … считыва ем входны е данные s:=[m]; k:=0; while not (n in s) and(kj then way(i,j); writeln end end. А лгоритм Флойда хорош всем, кроме одного: он требует хранить матрицу смеж ности, а это не всегда возможно. Кроме того, для определения длины кратчай шего пути между двумя конкретными вершинами, его упростить невозможно (т о есть все равно придется считать пути между всеми парами вершин). Если ве с любого ребра в графе вычисляется по некоторой формуле (например, как ра сстояние между двумя точками на плоскости, если таковыми являются верши ны нашего графа), то матрицу смежности можно не создавать вообще, а в проце ссе выполнения программы обращаться к функции вычисления веса ребра, со единяющего вершины i и j : a ( i , j ). В этом случае для определение кратчайшего пути между вершинами s и t исполь зуют алгоритм Дейкстры [5 – 7]. Все вершины в процессе работы этого алгорит ма разбиты на два множества: те, до которых кратчайший путь из вершины s уж е известен (в программе они помечены значениями true одномерного булевског о массива b) и все остальные. Cначала в первом множестве находится только в ершина s . На каждом шаге к нему добавляется одна из верш ин, текущее известное расстояние до которой минимально среди всех верши н из второго множества, обозначим ее p . Первоначально текущие расстояния (в п рограмме они хранятся в одномерном массиве l) от s до остальн ых вершин равны , а расстояние до s равно 0, p также равна s . На очередном же шаге мы пытаемся улучшить дли ну пути до каждой из вершин второго множества, сравнивая выражения l[p]+a(p,i) и l[i]. Нужно показать, почему минимальное из значений l, рассматриваемых на те кущем шаге, является длиной кратчайшего пути до соответствующей вершин ы, а, следовательно, этот путь содержит только вершины из первого множест ва. Если это не так, то есть кратчайший путь до этой вершины содержит и вер шины из второго множества, то минимальной оказалась бы длина пути от s до одн ой из этих вершин. Значит кратчайший путь до вершины p проходит т олько через вершины первого множества и больше его пересчитывать не нуж но. Приведем схему программы, реализующей этот алгоритм (функцию a(i, j) и значен ие “бесконечности” определять не будем): for i:=1 to nn do begin l[i]= ; b[i]:=false end; p:=s; l[s]:=0; b[s]:=true; f:=true; cтоит ли искать дальше while (p<>t) and f do begin f:=false; for i:=1 to nn do if not b[i] then if l[p]+a(p,i)
1Архитектура и строительство
2Астрономия, авиация, космонавтика
 
3Безопасность жизнедеятельности
4Биология
 
5Военная кафедра, гражданская оборона
 
6География, экономическая география
7Геология и геодезия
8Государственное регулирование и налоги
 
9Естествознание
 
10Журналистика
 
11Законодательство и право
12Адвокатура
13Административное право
14Арбитражное процессуальное право
15Банковское право
16Государство и право
17Гражданское право и процесс
18Жилищное право
19Законодательство зарубежных стран
20Земельное право
21Конституционное право
22Конституционное право зарубежных стран
23Международное право
24Муниципальное право
25Налоговое право
26Римское право
27Семейное право
28Таможенное право
29Трудовое право
30Уголовное право и процесс
31Финансовое право
32Хозяйственное право
33Экологическое право
34Юриспруденция
 
35Иностранные языки
36Информатика, информационные технологии
37Базы данных
38Компьютерные сети
39Программирование
40Искусство и культура
41Краеведение
42Культурология
43Музыка
44История
45Биографии
46Историческая личность
47Литература
 
48Маркетинг и реклама
49Математика
50Медицина и здоровье
51Менеджмент
52Антикризисное управление
53Делопроизводство и документооборот
54Логистика
 
55Педагогика
56Политология
57Правоохранительные органы
58Криминалистика и криминология
59Прочее
60Психология
61Юридическая психология
 
62Радиоэлектроника
63Религия
 
64Сельское хозяйство и землепользование
65Социология
66Страхование
 
67Технологии
68Материаловедение
69Машиностроение
70Металлургия
71Транспорт
72Туризм
 
73Физика
74Физкультура и спорт
75Философия
 
76Химия
 
77Экология, охрана природы
78Экономика и финансы
79Анализ хозяйственной деятельности
80Банковское дело и кредитование
81Биржевое дело
82Бухгалтерский учет и аудит
83История экономических учений
84Международные отношения
85Предпринимательство, бизнес, микроэкономика
86Финансы
87Ценные бумаги и фондовый рынок
88Экономика предприятия
89Экономико-математическое моделирование
90Экономическая теория

 Анекдоты - это почти как рефераты, только короткие и смешные Следующий
К услуге "Перезвони мне" следует добавить бесплатный ответ: "Тебе надо, ты и звони, у самого денег на счету нет".
Anekdot.ru

Узнайте стоимость курсовой, диплома, реферата на заказ.

Обратите внимание, реферат по информатике и информационным технологиям "Динамическое программирование, алгоритмы на графах", также как и все другие рефераты, курсовые, дипломные и другие работы вы можете скачать бесплатно.

Смотрите также:


Банк рефератов - РефератБанк.ру
© РефератБанк, 2002 - 2016
Рейтинг@Mail.ru