/* subsequence with maximal sum, computed in linear time */
#include <stdio.h>
#include <stdlib.h>
/**
* compute the subsequece with maximal sum
* @param[in] a the whole sequence
* @param[in] n number of elements in the sequence
* @param[out] st starting index of the subsequence
* @param[out] len number of elements in the subsequence
* @return the maximal sum
*/
int maxSumLinTime (int *a, int n, int *st, int *len) {
int maxSum = 0, sum = 0, i, s = 0;
*st = -1, *len = 0;
for (i = 0; i < n; i ++) {
sum += a[i];
if (sum > maxSum) {
maxSum = sum;
*st = s;
*len = i - s + 1;
}
if (sum < 0) {
sum = 0;
s = i + 1;
}
}
return maxSum;
}
int main(void) {
int a[] = { 1, -3, 4, -2, -1, 6, -8, 3, 1, 1 }, /* a[2] + a[3] + a[4] + a[5] = 7 */
st, len;
int sum = maxSumLinTime(a, sizeof(a)/sizeof(int), &st, &len);
printf("start of subsequence: %d, length of subsequence: %d, max. sum: %d\n",
st, len, sum);
return EXIT_SUCCESS;
}
Lyogc3Vic2VxdWVuY2Ugd2l0aCBtYXhpbWFsIHN1bSwgY29tcHV0ZWQgaW4gbGluZWFyIHRpbWUgKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgovKiogCiAqICBjb21wdXRlIHRoZSBzdWJzZXF1ZWNlIHdpdGggbWF4aW1hbCBzdW0KICogIEBwYXJhbVtpbl0gYSB0aGUgd2hvbGUgc2VxdWVuY2UgCiAqICBAcGFyYW1baW5dIG4gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXF1ZW5jZQogKiAgQHBhcmFtW291dF0gc3Qgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHN1YnNlcXVlbmNlCiAqICBAcGFyYW1bb3V0XSBsZW4gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzdWJzZXF1ZW5jZQogKiAgQHJldHVybiB0aGUgbWF4aW1hbCBzdW0KICovCmludCBtYXhTdW1MaW5UaW1lIChpbnQgKmEsIGludCBuLCBpbnQgKnN0LCBpbnQgKmxlbikgewogIGludCBtYXhTdW0gPSAwLCBzdW0gPSAwLCBpLCBzID0gMDsKICAqc3QgPSAtMSwgKmxlbiA9IDA7CiAgZm9yIChpID0gMDsgaSA8IG47IGkgKyspIHsKICAgIHN1bSArPSBhW2ldOwogICAgaWYgKHN1bSA+IG1heFN1bSkgewogICAgICBtYXhTdW0gPSBzdW07CiAgICAgICpzdCA9IHM7CiAgICAgICpsZW4gPSBpIC0gcyArIDE7CiAgICB9CiAgICBpZiAoc3VtIDwgMCkgewogICAgICBzdW0gPSAwOwogICAgICBzID0gaSArIDE7CiAgICB9CiAgfQogIHJldHVybiBtYXhTdW07Cn0KCmludCBtYWluKHZvaWQpIHsKICBpbnQgYVtdID0geyAxLCAtMywgNCwgLTIsIC0xLCA2LCAtOCwgMywgMSwgMSB9LCAvKiBhWzJdICsgYVszXSArIGFbNF0gKyBhWzVdID0gNyAqLwogICAgICBzdCwgbGVuOwogIGludCBzdW0gPSBtYXhTdW1MaW5UaW1lKGEsIHNpemVvZihhKS9zaXplb2YoaW50KSwgJnN0LCAmbGVuKTsKICBwcmludGYoInN0YXJ0IG9mIHN1YnNlcXVlbmNlOiAlZCwgbGVuZ3RoIG9mIHN1YnNlcXVlbmNlOiAlZCwgbWF4LiBzdW06ICVkXG4iLAogICAgICAgICBzdCwgbGVuLCBzdW0pOwogIHJldHVybiBFWElUX1NVQ0NFU1M7Cn0K