樹塔狂想曲(tower)
【問題描述】
相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是:(i,j)號點只能走向(i+1,j)或者(i+1,j+1)。如下圖是乙個數塔,對映到該數塔上行走的規則為:從左上角的點開始,向下走或向右下走直到最底層結束。
1
3 8
2 5 0
1 4 3 8
1 4 2 5 0
路徑最大和是 1+8+5+4+4 = 22,1+8+5+3+5 = 22 或者 1+8+0+8+5 = 22。小 s 覺得這個問題 so easy。於是他提高了點難度,他每次 ban 掉乙個點(即規定哪個點不能經過),然後詢問你不走該點的最大路徑和。當然他上乙個詢問被 ban 掉的點過乙個詢問會恢復(即每次他在原圖的基礎上 ban 掉乙個點,而不是永久化的修改)。
【輸入格式】
第一行包括兩個正整數,n,m,分別表示數塔的高和詢問次數。以下 n 行,第 i 行包括用空格隔開的 i - 1 個數,描述乙個高為 n 的數塔。而後 m 行,每行包括兩個數 x,y,表示第 x 行第 y 列的數塔上的點被小 s ban 掉,無法通行。(由於讀入資料較大,c 或 c++請使用較為快速的讀入方式)
【輸出格式】
m 行每行包括乙個非負整數,表示在原圖的基礎上 ban 掉乙個點後的最大路徑和,如果被ban 掉後不存在任意一條路徑,則輸出-1。
【輸入樣例】
5 3
1
3 8
2 5 0
1 4 3 8
1 4 2 5 0
2 2
5 4
1 1
【輸出樣例】
17
22
-1
【樣例解釋】
第一次是
1
3 x
2 5 0
1 4 3 8
1 4 2 5 0
1+3+5+4+4 = 17 或者 1+3+5+3+5=17
第二次:
1
3 8
2 5 0
1 4 3 8
1 4 2 x 0
1+8+5+4+4 = 22
第三次:你們都懂的!無法通行,-1!
【資料規模】所有測試資料範圍和特點如下:對於所有資料,數塔中的數 x 的大小滿足
var n,m,i,j,x,y,q,cas:longint;a:array[0..1010,0..1010]of longint;
dp,dp1,f,g:array[0..1010,0..1010]of int64;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
begin
assign(input,'tower.in');reset(input);
assign(output,'tower.out');rewrite(output);
readln(n,m);
for i:=1 to n do
begin
for j:=1 to i do read(a[i][j]);
readln;
end;
for i:=1 to n do
for j:=1 to i do dp[i][j]:=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
for i:=n downto 1 do
for j:=1 to i do dp1[i][j]:=max(dp1[i+1][j],dp1[i+1][j+1])+a[i][j];
for i:=1 to n do
begin
for j:=1 to i do f[i][j]:=max(f[i][j-1],dp[i][j]+dp1[i][j]-a[i][j]);
for j:=i downto 1 do g[i][j]:=max(g[i][j+1],dp[i][j]+dp1[i][j]-a[i][j]);
end;
for cas:=1 to m do
begin
readln(x,y);
if(x=1)and(y=1)then begin writeln(-1);continue;end;
q:=max(f[x][y-1],g[x][y+1]);
writeln(q);
end;
close(input);close(output);
end.
樹塔狂想曲
2017年09月23日普級組 樹塔狂想曲 time limit 40000ms memory limit 256000k total submit 24 accepted 11 case time limit 2000ms description 相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙...
DP 樹塔狂想曲
有乙個數字金字塔,讓你求出去掉乙個點後,從最頂端走到最低端的最大值 只能往下或右下走 相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是 i,j 號點只能走向 i 1,j 或者 i 1,j 1 如下圖是乙個數塔,對映到該數塔上行走的規則為 從左上角的點開始...
DP 樹塔狂想曲
相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是 i,j 號點只能走向 i 1,j 或者 i 1,j 1 如下圖是乙個數塔,對映到該數塔上行走的規則為 從左上角的點開始,向下走或向右下走直到最底層結束。13 8 2 5 0 1 4 3 8 1 4 2 5...