求最遠曼哈頓距離,對於一個n維的空間,其中兩點的曼哈頓距離為:|x1-y1|+|x2-y2|+|x3-y3|+|x4-y4|+……+|xn-yn| (兩點的坐標分別為(x1,x2,……,xn)、(y1,y2,……,yn))
以下以二維平面為例研究:
設距離最遠的兩點為i,j,可知所求的最大距離必定有以下四種形式之一:
(xi-xj)+(yi-yj), (xj-xi)+(yi-yj), (xi-xj)+(yj-yi), (xj-xi)+(yj-yi) 變形一下,把相同點的坐標放到一起,
即 (xi+yi)-(xj+yj), (-xi+yi)-(-xj+yj), (xi-yi)-(xj-yj), (-xi-yi)-(-xj-yj) 再變一下,把中間變成‘+',
即 (xi+yi)+(-xj-yj), (-xi+yi)+(xj-yj), (xi-yi)+(-xj+yj),(-xi-yi)+(xj+yj)
由此,可以發現一個規律,即去絕對值之后把同一點的坐標放在一起,對應坐標的符號總是相反的,如(-xi+yi)與(xj-yj)。
假如我們用0表示負號,1表示正號,則(-xi+yi)與(xj-yj)兩個括號內的符號可以表示為:01和10
當你多舉幾個例子之后,就會發現,對於一個確定的維數D,符號轉化成的二進制數,它們的和總是一個定值,即2^d-1, 這就說明了,當我們知道了前一個點去絕對值之后的符號,就可以知道第二個點去絕對值后的符號是怎樣的
於是只要對所有的點(xi,yi),依次計算出(xi+yi),(xi-yi),(-xi+yi),(-xi-yi)這四種形式,然后把每個點i算出來的這四種情況的最大值分別記錄到一個數組max[]中,然后枚舉每一種去絕對值的組合,組合后的最大值即為answer
program ttdd8; var x,max:array[0..255] of longint; sum,ans,i,j,k,n,d:longint; begin readln(n,d); for i:=0 to 31 do max[i]:=-maxlongint; for i:=1 to n do begin for j:=0 to d-1 do read(x[j]); for j:=0 to 1<<d-1 do begin sum:=0; for k:=0 to d-1 do if (j shr k) and 1=1 then inc(sum,x[k]) else dec(sum,x[k]); if sum>max[j] then max[j]:=sum; end; end; ans:=0; for j:=0 to 1<<d-1 do if ans<max[j]+max[1<<d-1-j] then ans:=max[j]+max[1<<d-1-j]; writeln(ans); end.