Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 24.11.2015
Сообщений: 2

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

24.11.2015, 22:00. Показов 2850. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Динамическое программирование – это способ решения сложных оптимизационных или расчетных задач путем разбиения данной задачи на более простые, меньшие по размерности подзадачи. Чтобы убедиться в удобстве этого аппарата, рассмотрим задачу.
Кубик, грани которого помечены цифрами от 1 до 6, бросают N раз. Определите вероятность того, что произведение выпавших чисел будет в точности равна Q.
Теперь рассмотрим N-ное бросание кубика. Оно обязательно увеличит текущее произведение в 1, 2, 3, 4, 5 или 6 раз. Тогда нам нужно просто посмотреть, из каких произведений на предыдущем броске (N-1) можно получить текущее путем умножения его на 1, 2, 3, 4, 5 или 6. Другими словами, мы обращаемся к тем произведениям, количество выпадений которых мы подсчитали на предыдущем броске и которые получились из текущего путем деления нацело на 1, 2, 3, 4, 5 или 6. Сложив количество этих исходов, мы получим как раз то количество, которое нам нужно.
Тогда будем заполнять таблицу слева направо сверху вниз по формуле:

https://www.cyberforum.ru/cgi-bin/latex.cgi?a[i,j]=a[i,j]+a[i-1, \frac{j}{k}]

 123456789101112131415161718Q
1111111000000000000 
2122324021204002102 
31336390736015006609 
414410416016612036001219024 
5155155250301020070002045050 
61662163605015300120003090090 
7177287490772142018900421610147 
81883686401122856028000562660224 
91994598101563672039600724140324 
1011010551010002104590054000906150450 
N                   

Например, для N = 7 и Q = 12 проверяем, на что делится нацело число 12:
• На 1 – тогда по формуле (1) нам надо обратиться к ячейке с индексами i = 7 – 1 = 6 и j = 12 / 1 = 12. В этой ячейке a[6,12] лежит значение 120.
• На 2 – обращаемся к ячейке i = 6 и j = 12/2 = 6. В ячейке a[6, 6] находится значение 36.
• На 3 – в ячейке a[6, 12/3] значение 21.
• На 4 - в ячейке a[6, 12/4] значение 6.
• На 5 Q = 12 не делится, значит этот пункт мы пропускаем.
• На 6 - в ячейке a[6, 12/6] значение 6.

Привожу программу, составляющую таблицу для введенных значений:
Pascal Скопировано
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
var
  n, i, j, k, z: integer;
  x: real;
  q: integer;
  a: array[,] of real;
 
function y(a, b: integer): integer;
var
  i: integer;
  x: integer;
begin
  x := 1;
  for i := 1 to b do
    x := x * a;
  y := x;
end;
 
begin
 writeln('Введите произведение: Q = ');
  read(q);
   writeln('Введите количество бросков: N = ');
   read(n);
  setlength(a,  n + 1,q + 1);
  for i := 0 to n do
    for j := 0 to q do
      a[i, j] := 0;
  if q < 6 then z := q else z := 6;//если произведение меньше шести
  for j := 1 to z do
    a[1, j] := 1;
    
  for i := 1 to n do
    for j := 1 to q do
      for k := 1 to 6 do
        if j mod k = 0 then
          a[i, j] := a[i, j] + a[i - 1, j div k];
  for i:=0 to n do
   a[i,0]:=i;
  for j:=0 to q do
   a[0,j]:=j;   
   
  for i := 0 to n do 
  begin
    writeln;
    for j := 0 to q do
      write(a[i, j]:3:0, ' ');
  end;
  writeln;
  x:=a[n,q]/y(6,n);
   writeln('Вероятность: ',x);
end.
Очевидно, что количество удачных исходов лежит в ячейке a[N, Q]. Для того чтобы перейти к вероятности, нам нужно всего лишь разделить это значение на количество всех исходов при N бросках:

https://www.cyberforum.ru/cgi-bin/latex.cgi?p(N,Q)=\frac{a[N,Q]}{{6}^{N}}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2015, 22:00
Ответы с готовыми решениями:

Немного о веб-программировании, программах и SEO
Добрый день. У меня комплексный вопрос о веб-программировании, программах и SEO. Он будет в конце сообщения, а пока начальная...

Немного о динамическом выделении памяти ...
объявление данных в классе: class Employee {.......... private: char *firstName; char *lasrName; }

В наушник попало немного воды и он стал немного тише играть
В наушник попало немного воды и он стал немного тише играть. Это практически не заметно, но всё же раздражает. Так это пройдет со временем...

3
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
 Аватар для magirus
28047 / 15783 / 983
Регистрация: 15.09.2009
Сообщений: 67,753
Записей в блоге: 78
24.11.2015, 22:05
и к чему весь этот опус?
0
0 / 0 / 0
Регистрация: 24.11.2015
Сообщений: 2
24.11.2015, 22:45  [ТС]
А Вы считаете этот "опус" бесполезным? Я решила поделиться им, потому что у многих моих знакомых возникали проблемы с подобными задачами.
0
Платежеспособный зверь
 Аватар для кот Бегемот
8959 / 4384 / 1652
Регистрация: 28.10.2009
Сообщений: 11,629
26.11.2015, 00:19
Не слушайте этого супер-пупера, Вы правильно сделали, что поместили этот пример. Тема сложная и хорошо, когда её объясняют простыми словами и понятным языком. Спасибо.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2015, 00:19
Помогаю со студенческими работами здесь

Об 1С-программировании
Приветствую! Хочу услышать ваше мнение о текущей ситуации: правильный ли я сделал выбор. Я окончил учёбу в техникуме по специальности...

Математика в программировании
Правда ли, что в ВУЗах, которые занимаются подготовкой программистов идет углубленное изучение математики, и вообще, нужна ли математика в...

О программировании и действительности
Заинтересовал один известный вопрос, перевёрнутый наоборот - а всякий ли программный код может представлять некоторое явление в реальности?...

Математика в программировании
Дорогие программисты, объясните мне пожалуйста, как математика отражается в программировании и такие разделы как арифметика, элементарная...

С++ в web-программировании
Добрый день! Вопрос дилетанта. Применяется ли язык C++ в web-программировании? Если да, то в каких аспектах?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер