<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://nerc.itmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=89.112.48.122&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://nerc.itmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=89.112.48.122&amp;*"/>
		<link rel="alternate" type="text/html" href="https://nerc.itmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/89.112.48.122"/>
		<updated>2026-11-13T03:56:09Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://nerc.itmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=35405</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="https://nerc.itmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=35405"/>
				<updated>2014-01-08T00:56:28Z</updated>
		
		<summary type="html">&lt;p&gt;89.112.48.122: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Задача о расстановке знаков в выражении''' — задача о нахождении максимального значения выражения, полученного расстановкой знаков  &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобок в последовательности &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием принципа оптимальности на подотрезке[http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.9F.D1.80.D0.B8.D0.BD.D1.86.D0.B8.D0.BF_.D0.BE.D0.BF.D1.82.D0.B8.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_.D0.BD.D0.B0_.D0.BF.D0.BE.D0.B4.D0.BE.D1.82.D1.80.D0.B5.D0.B7.D0.BA.D0.B0.D1.85]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции “+” и “*”, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&gt;
Подзадачами, через которые мы будем выражать оптимальное решение, будут задачи об оптимальной расстановке скобок в произведениях наших операндов, начиная с i-го и заканчивая j-м. Запоминать результат оптимального решения соответствующей подзадачи мы будем в элементе d[i, j] матрицы, размером n*n, диагональные элементы которой (d[i, i]) равны операндам, а для i &amp;gt; j все элементы равны 0. Пусть мы хотим подсчитать значение арифметического выражения для операндов, начиная с i-го и заканчивая j-м для i &amp;lt; j. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером k (k &amp;lt; j) и эта операция — сложение, то результат подсчета будет равен сумме элементов d[i, k] и d[k+1, j] нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с i-го по k-й и с k+1-го по j-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для i &amp;gt; j матрица d не заполнена, мы можем отвести эти элементы для хранения минимумов, только запоминать результат решения этой подзадачи для операндов, начиная с i-го и заканчивая j-м, мы будем в элементе d[j, i]. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&lt;br /&gt;
  &lt;br /&gt;
  for i := 1 to n do&lt;br /&gt;
    d[i][i] := a[i];&lt;br /&gt;
  &lt;br /&gt;
  for i := n - 1 downto 1 do&lt;br /&gt;
    for j := i + 1 to n do&lt;br /&gt;
      for k := i to j - 1 do&lt;br /&gt;
        d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
  &lt;br /&gt;
  write(d[1][n]); // вывод ответа&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность 2, 1, 1, 2. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| || j = 1 || j = 2 || j = 3 || j = 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 1 || 2 || 3 || 4 || 9&lt;br /&gt;
|-&lt;br /&gt;
| i = 2 || 0 || 1 || 2 || 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 3 || 0 || 0 || 1 || 3&lt;br /&gt;
|-&lt;br /&gt;
| i = 4 || 0 || 0 || 0 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>89.112.48.122</name></author>	</entry>

	<entry>
		<id>https://nerc.itmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=35404</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="https://nerc.itmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=35404"/>
				<updated>2014-01-08T00:56:04Z</updated>
		
		<summary type="html">&lt;p&gt;89.112.48.122: /* Доказательство */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Задача о расстановке знаков в выражении''' — задача о нахождении максимального значения выражения, полученного расстановкой знаков  &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобок в последовательности &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием принципа оптимальности на подотрезке[http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.9F.D1.80.D0.B8.D0.BD.D1.86.D0.B8.D0.BF_.D0.BE.D0.BF.D1.82.D0.B8.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_.D0.BD.D0.B0_.D0.BF.D0.BE.D0.B4.D0.BE.D1.82.D1.80.D0.B5.D0.B7.D0.BA.D0.B0.D1.85]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции “+” и “*”, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&gt;
Подзадачами, через которые мы будем выражать оптимальное решение, будут задачи об оптимальной расстановке скобок в произведениях наших операндов, начиная с i-го и заканчивая j-м. Запоминать результат оптимального решения соответствующей подзадачи мы будем в элементе d[i, j] матрицы, размером n*n, диагональные элементы которой (d[i, i]) равны операндам, а для i &amp;gt; j все элементы равны 0. Пусть мы хотим подсчитать значение арифметического выражения для операндов, начиная с i-го и заканчивая j-м для i &amp;lt; j. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером k (k &amp;lt; j) и эта операция — сложение, то результат подсчета будет равен сумме элементов d[i, k] и d[k+1, j] нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с i-го по k-й и с k+1-го по j-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для i &amp;gt; j матрица d не заполнена, мы можем отвести эти элементы для хранения минимумов, только запоминать результат решения этой подзадачи для операндов, начиная с i-го и заканчивая j-м, мы будем в элементе d[j, i]. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&lt;br /&gt;
  &lt;br /&gt;
  for i := 1 to n do&lt;br /&gt;
    d[i][i] := a[i];&lt;br /&gt;
  &lt;br /&gt;
  for i := n - 1 downto 1 do&lt;br /&gt;
    for j := i + 1 to n do&lt;br /&gt;
      for k := i to j - 1 do&lt;br /&gt;
        d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
  &lt;br /&gt;
  write(d[1][n]); // вывод ответа&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность 2, 1, 1, 2. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| || j = 1 || j = 2 || j = 3 || j = 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 1 || 2 || 3 || 4 || 9&lt;br /&gt;
|-&lt;br /&gt;
| i = 2 || 0 || 1 || 2 || 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 3 || 0 || 0 || 1 || 3&lt;br /&gt;
|-&lt;br /&gt;
| i = 4 || 0 || 0 || 0 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>89.112.48.122</name></author>	</entry>

	</feed>