演算法:dp
與二取方格數類似,設f[i,j,k,l]為走了i步(初始為1步)後,第1次取數在j行,第2次取數在k行,第3次取數在l行的最大值。
然後就是類似的轉移,注意這裡一共有8種轉移情況,都要考慮到,設j為當前走到的行,加上j行的值,然後去判斷與k,l是否重複,不重複還要加上它們的值。
走i步最多能走到第i行。
最後走到右下角需要2*n-1步,所以輸出f[2*n-1,n,n,n]。
program p1414;
const
maxn=20;
maxm=39;
var n:longint;
a:array [0..maxn,0..maxn] of longint;
f:array [0..maxm,0..maxm,0..maxm,0..maxm] of longint;
procedure init;
var i,j:longint;
begin
readln(n);
for i:=1 to n do
begin
for j:=1 to n do read(a[i,j]);
readln;
end;
end;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
procedure main;
var i,j,k,l:longint;
begin
f[1,1,1,1]:=a[1,1];
for i:=1 to 2*n-1 do
begin
for j:=1 to i do
begin
for k:=1 to i do
begin
for l:=1 to i do
begin
f[i,j,k,l]:=max(max(max(f[i-1,j,k,l],f[i-1,j-1,k,l]),max(f[i-1,j,k-1,l],f[i-1,j,k,l-1])),max(max(f[i-1,j-1,k-1,l],f[i-1,j-1,k,l-1]),max(f[i-1,j,k-1,l-1],f[i-1,j-1,k-1,l-1])));
inc(f[i,j,k,l],a[j,i-j+1]);
if (j<>k) then inc(f[i,j,k,l],a[k,i-k+1]);
if (j<>l) and (k<>l) then inc(f[i,j,k,l],a[l,i-l+1]);
end;
end;
end;
end;
end;
begin
assign(input,'p1414.in'); reset(input);
assign(output,'p1414.out'); rewrite(output);
init;
main;
writeln(f[2*n-1,n,n,n]);
close(input); close(output);
end.
三取方格數
時間限制 1 sec 記憶體限制 128 mb 設有n n的方格圖,我們將其中的某些方格填入正整數,而其他的方格中放入0。某人從圖得左上角出發,可以向下走,也可以向右走,直到到達右下角。在走過的路上,他取走了方格中的數。取走後方格中數字變為0 此人從左上角到右下角共走3次,試找出3條路徑,使得取得的...
三取方格數
描述 description 設有n n的方格圖,我們將其中的某些方格填入正整數,而其他的方格中放入0。某人從圖得左上角出發,可以向下走,也可以向右走,直到到達右下角。在走過的路上,他取走了方格中的數。取走後方格中數字變為0 此人從左上角到右下角共走3次,試找出3條路徑,使得取得的數總和最大。輸入格...
方格取數 1
problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...