Это решение этой проблемы в основном должно учитывать 2 состояния.
Предположим, что вы в настоящее время находитесь в индексе i.Теперь вам нужно решить, хотите ли вы выбрать элемент индекса i в вашей окончательной сумме.
Состояния следующие:
1) Если вы решите, что элемент по индексу i должен быть включен в итоговую сумму, то не имеет значения, что этот элемент по предыдущему индексу, т.е. i-1, включен или нет.
2) Если вы решите, что элемент с индексом i не должен быть включен в итоговую сумму, то обязательно, чтобы элемент с предыдущим индексом, т.е. i-1, был включен.
В вашем решении вы заботитесь только о состоянии 1, но не о состоянии 2. Таким образом, вам нужно будет поддерживать 2 переменные для оптимальных промежуточных ответов по каждому индексу.
Вот примеркод:
function calculate(int arr[], int start, int end){
dp[start][0] = arr[start];
dp[start][1] = 0LL;
for(int i=start+1;i<=end;i++){
dp[i][1] = dp[i-1][0]; //State 2
dp[i][0] = arr[i] + min( dp[i-1][1], dp[i-1][0] ); //State 1
}
return min( dp[end][0], dp[end][1] );
}
Примечание: массив dp - это двумерный массив, в котором хранятся промежуточные оптимальные ответы.
dp [i] [1] = оптимальный ответ без включения элемента.
dp [i] [0] = Оптимальный ответ при включении элемента.