Про задачу с монетами. Во-первых, там требуется найти минимальное число монет, то есть один способ. Во-вторых, построение базиса Грёбнера также не является быстрой операций: в Википедии написано, что размер базиса может быть не только экспоненциальным, но и вида
![$a^{b^n}$ $a^{b^n}$](https://dxdy-03.korotkov.co.uk/f/2/f/4/2f47a12de3065fdee2302feb724e3af282.png)
, что совсем много. И, в-третьих, задачи всё же значительно отличаются - тот метод в вашем случае точно не подойдёт. Впрочем, если он вам интересен, можете его изучить по схеме группы -> кольца -> кольцо многочленов -> базисы Грёбнера.
Про вашу задачу. Какое у вас ограничение на
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
? Вообще, мне видится разумным следующий перебор: пусть
![$(a_i)_{i=1}^n$ $(a_i)_{i=1}^n$](https://dxdy-02.korotkov.co.uk/f/d/0/7/d076cbc07484fb0994bbe6064dcf497882.png)
- входная последовательность, тогда для всех пар
![$l, r$ $l, r$](https://dxdy-04.korotkov.co.uk/f/b/e/8/be8ee32c8a53147c537f577778fa81e082.png)
, что
![$1\leqslant l < r\leqslant n$ $1\leqslant l < r\leqslant n$](https://dxdy-04.korotkov.co.uk/f/3/2/8/328a9b946dd8aef1cdebed00c84daad782.png)
, в порядке возрастания величины
![$r - l$ $r - l$](https://dxdy-03.korotkov.co.uk/f/2/a/d/2ad74d9dbdf78f8af813f929aa18bdcd82.png)
вычисляем множество всех возможных чисел, которые получаются операциями и скобками из чисел
![$a_l\ldots a_r$ $a_l\ldots a_r$](https://dxdy-04.korotkov.co.uk/f/7/6/a/76a3e3b1448d0bde87a83f3c091f4a2882.png)
. Подсчет происходит понятным способом: пытаемся в выражение для
![$a_l\ldots a_r$ $a_l\ldots a_r$](https://dxdy-04.korotkov.co.uk/f/7/6/a/76a3e3b1448d0bde87a83f3c091f4a2882.png)
выделить последнюю операцию. То есть перебираем все позиции
![$t$ $t$](https://dxdy-01.korotkov.co.uk/f/4/f/4/4f4f4e395762a3af4575de74c019ebb582.png)
, что
![$l\leqslant t < r$ $l\leqslant t < r$](https://dxdy-03.korotkov.co.uk/f/6/6/2/6620b943093fc53b5db65f9d331abbf982.png)
, что означает, что мы расставляем скобки как
![$(a_l\ldots a_t) * (a_{t+1}\dots a_r)$ $(a_l\ldots a_t) * (a_{t+1}\dots a_r)$](https://dxdy-01.korotkov.co.uk/f/c/1/9/c194cfb84b7d0eae27920907d82ad1f182.png)
, вместо звёздочки пытаемся подставить все четыре операции, вместе выражений в скобкам подставляем всевозможные числа из них (они уже посчитаны и хранятся в памяти). Важно при этом каждый результат добавлять один раз, то есть поддерживать именно множество.
Чтобы уметь восстанавливать ответ, делаем стандартный трюк: для каждой пары
![$l, r$ $l, r$](https://dxdy-04.korotkov.co.uk/f/b/e/8/be8ee32c8a53147c537f577778fa81e082.png)
и каждого числа, полученного в выражении
![$a_l\ldots a_r$ $a_l\ldots a_r$](https://dxdy-04.korotkov.co.uk/f/7/6/a/76a3e3b1448d0bde87a83f3c091f4a2882.png)
, храним все способы получения этого числа: то есть список из троек чисел: число
![$t$ $t$](https://dxdy-01.korotkov.co.uk/f/4/f/4/4f4f4e395762a3af4575de74c019ebb582.png)
, число, взятое слева, то есть от
![$(a_l\ldots a_t)$ $(a_l\ldots a_t)$](https://dxdy-01.korotkov.co.uk/f/8/b/c/8bc9b48faac5b76fb97ea179042119b482.png)
, и число, взятое справа, то есть от
![$(a_{t+1}\dots a_r)$ $(a_{t+1}\dots a_r)$](https://dxdy-04.korotkov.co.uk/f/3/1/7/3175bffdee4356828ef2600491c60a4482.png)
.
Возможно, немного путано объяснил, но тут тот случай, когда решение гораздо проще, чем его формальное изложение. Так что я надеюсь, что вы поняли, а если нет, то задавайте вопросы.
Сложность у алгоритма высокая, памяти нужно много.