Если необходимо разделить массив на ровно k подотрезков, то просто добавляется второй параметр в динамическом программировании - на сколько отрезков разбиваем.
То есть теперь будем считать следующее дп:
dp[i][j] - ответ для первых i элементов, если мы разбиваем их на ровно j отрезков.
Следите за невалидными состояниями.
Пересчет динамики такой же, но с учетом второго параметра. То есть подсчитывая dp[i][k] и перебирая левую границу последнего подотрезка j, то пересчитываем dp[i][k] через dp[j - 1][k - 1] и значение отрезка [j;i].