相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是:(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 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!
比賽時想了乙個數字金字塔的dp,後來比賽結束後,聽大佬講解才發現題目中有說會封掉某乙個點,也就是不能經過這一點,而數字金字塔的dp沒有考慮不到不能經過這個點的最優情況
最後,聽大佬講解,得知正解:
求經過乙個點的最優距離(起點到乙個點的距離+終點到乙個點的距離),求出每一行的最大值和次大值,若最大值的點沒被封,就取這個最大值,否則取次大值。
#include
#include
#include
using
namespace std;
int f[
1005][
1005
],a[
1005][
1005
],maxx,sum[
1005];
int cans[
1005
],ans[
1005
],ff[
1005][
1005
],fd[
1005][
1005];
int n,m,x,y;
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*flag;
}//快讀
void
write
(int x)
if(x>9)
write
(x/10);
putchar
(x%10+48
);return;}
//快輸
intdp()
intmain()
}
DP 樹塔狂想曲
有乙個數字金字塔,讓你求出去掉乙個點後,從最頂端走到最低端的最大值 只能往下或右下走 相信大家都在長訓班學過樹塔問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是 i,j 號點只能走向 i 1,j 或者 i 1,j 1 如下圖是乙個數塔,對映到該數塔上行走的規則為 從左上角的點開始...
樹塔狂想曲
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...