JSFiddle - React, Tailwind, and code Playground
HTML
<div id="array"></div>
<div id="length"></div>
<div id="path"></div>
JavaScript
var a = [3,5,2,6]; // 7
// var a = [4,3,4,3,4,3,4]; // 7
var MAX = 50;
var n = a.length - 1;
if (n > MAX) throw new Error("Too many items - at most " + (MAX+1) + " can be given but " + (n+1) + " are present.");
// iterate over all '+' and '-' sequences and find best folding (path)
var minLength = (n > 0 ? 2 * a.reduce((max, it) => Math.max(max, it), 0) : a[0] || 0); // 2*max(a)
var minPath;
for (var i=0, upto=1<<n; i<upto; ++i) { // each of "n" lowest bits of "i" represents '+' or '-'
var bounds={left:0, right: a[0]}, pos=a[0], j=i;
for (var k=1; k<=n; ++k, j>>=1) {
pos += (j&1) ? -a[k] : a[k];
bounds = { left: Math.min(bounds.left, pos), right: Math.max(bounds.right, pos) };
if (bounds.right - bounds.left >= minLength) break; // optimization
}
var curLength = bounds.right - bounds.left;
if (curLength < minLength) {
minLength = curLength;
minPath = i;
}
}
// construct user-friendly display of the best folding
var cpath = minPath, pathStr = "" + (n >= 0 ? a[0] : "");
for (var i=1; i<=n; ++i, cpath>>=1) {
pathStr += (cpath&1) ? " - " : " + ";
pathStr += a[i];
}
document.getElementById("array").textContent = "Links: " + JSON.stringify(a, null, " ");
document.getElementById("length").textContent = "Minimal length: " + minLength;
document.getElementById("path").textContent = "Folding: " + pathStr;