最遠曼哈頓距離


 求最遠曼哈頓距離,對於一個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.

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM