在阅读《面向计算机科学的数理逻辑:系统建模与推理》书4.3.3节时,看到对于最小和截段的一种O(n)的实现。
#include <iostream>
using namespace std;
int min(int a, int b){
if(a < b){
return a;
}else{
return b;
}
}
int main(){
int a[6] = {-1, 3, 15, -6, 4, -5};
int k = 1;
int t = a[0];
int s = a[0];
while(k != 6){
t = min(t + a[k], a[k]);
s = min(s, t);
k++;
}
cout << "s is " << s << endl;
return 0;
}
其中,变量$t$存储了以$a[k]$结尾的截段的最小和,变量$s$存储了到目前为止看到的最小和。