TYVJ1414(三取方格數)

2021-05-27 09:38:30 字數 1601 閱讀 6125

演算法: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...