Учитывая массив vector<int> arr
с положительными и отрицательными записями, задача максимального непрерывного подпоследовательности требует найти (смежный) отрезок массива arr
с максимальной суммой. Сумма пустого сегмента равна нулю. Код C++ используемого алгоритма выглядит следующим образом:Максимальная непрерывная подпоследовательность - динамическое программирование или жадный алгоритм?
int MaxContSum(const vector<int>& arr){
int i,sum=0,max=0;
for(i=0;i<arr.size();i++){
if(arr[i]>=0) {if(sum<0) sum=0;}
else {if(sum>max) max=sum;}
sum+=arr[i];
}
if(sum>max) max=sum; return max;
}
Является ли этот алгоритм жадным алгоритмом или динамическим программированием? Похоже, он просто просматривает записи один за другим и применяет разные стратегии, основанные на том, является ли arr[i]
положительным или отрицательным, локально проверяемым условием. Почему эта проблема появляется в главе динамического программирования?
Я вижу. Условие 'sum <0' не является локально проверяемым, потому что переменная' sum' переносит информацию из прошлого в текущее состояние. Эта проблема показывает преимущество изучения истории - изменить жадную стратегию принятия решений на динамическое программирование. Наши предыдущие люди сделали для нас «подзадачу». Мы можем выбрать, хотим ли мы наследовать или отбрасывать наследие на основе информации, которая им недоступна. –
'max' записывает результат завершения сегмента, а' sum' записывает результат не оканчивания сегмента.Обе возможности разыгрываются, и решение принимается, когда оба выигрыша четко видны в шаге 'if (sum <0) sum = 0;'. Жадный алгоритм сделает раннее решение и придерживаться его. –