给定带有正和负入场的数组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]
是否为负数或是否为局部可检查条件应用不同的策略。为什么这个问题出现在动态编程章节中呢?这个问题应该有才能有资格与DP解决
我明白了。条件'sum <0'不是本地可检查的,因为变量'sum'将过去的信息传送到当前状态。这个问题显示了研究历史的优势 - 将贪婪的决策策略转变为动态规划。我们以前的人为我们做了一个“小问题”。我们可以根据他们无法获得的信息选择是继承还是丢弃遗产。 –
'max'记录终止段的结果,'sum'记录不终止段的结果。这两种可能性都发挥出来了,当“if(sum <0)sum = 0;'step”中清楚地看到两种收益时,就做出决定。贪婪算法会做出早期决定并坚持下去。 –