DP 樹塔狂想曲

2021-09-23 15:29:34 字數 2389 閱讀 9086

有乙個數字金字塔,讓你求出去掉乙個點後,從最頂端走到最低端的最大值(只能往下或右下走)

相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是:(i,j)號點只能走向(i+1,j)或者(i+1,j+1)。如下圖是乙個數塔,對映到該數塔上行走的規則為:從左上角的點開始,向下走或向右下走直到最底層結束。

13 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

13 8

2 5 0

1 4 3 8

1 4 2 5 0

2 25 4

1 1

17

22-1

【樣例解釋】

第一次是

1

3 x2 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 82 5 0

1 4 3 8

1 4 2 x 0

1+8+5+4+4 = 22

第三次:你們都懂的!無法通行,-1!

很明顯, 直接暴力是不可能的,我們先預處理出來從起點到某個點的最大值,和從某個點到終點的最大值,然後就可以求出經過某個點的最大值,然後就可以求出某一行的最大值和次大值

然**過經過輸入的點是最大值,那說明不能走,那走次大的,否則走最大的

#include

#include

#include

using

namespace std;

int n,m,xx,yy,num,a[

1005][

1005

],f[

1005][

1005];

int df[

1005][

1005

],ff[

1005][

1005

],ans[

1005

],ans1[

1005];

intread()

//快讀

while

(x>=

'0'&&x<=

'9') l=

(l<<3)

+(l<<1)

+x-48

,x=getchar()

;return l*d;

}void

writ

(int c)

void

write

(int s)

intmain()

for(

int i=n;i>0;

--i)

for(

int j=

1;j<=i;

++j)

df[i]

[j]=

max(df[i+1]

[j],df[i+1]

[j+1])

+a[i]

[j];

for(

int i=

1;i<=n;

++i)

for(

int j=

1;j<=i;

++j)

if(j!=num)

ans1[i]

=max

(ans1[i]

,ff[i]

[j])

;//求次大的

}for

(int i=

1;i<=m;

++i)

}

DP 樹塔狂想曲

相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是 i,j 號點只能走向 i 1,j 或者 i 1,j 1 如下圖是乙個數塔,對映到該數塔上行走的規則為 從左上角的點開始,向下走或向右下走直到最底層結束。13 8 2 5 0 1 4 3 8 1 4 2 5...

樹塔狂想曲

2017年09月23日普級組 樹塔狂想曲 time limit 40000ms memory limit 256000k total submit 24 accepted 11 case time limit 2000ms description 相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙...

樹塔狂想曲tower

樹塔狂想曲 tower 問題描述 相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是 i,j 號點只能走向 i 1,j 或者 i 1,j 1 如下圖是乙個數塔,對映到該數塔上行走的規則為 從左上角的點開始,向下走或向右下走直到最底層結束。1 3 8 2 5...