北郵 招聘礦工 記憶化 or dp

2021-10-25 05:14:59 字數 2406 閱讀 6956

本博主僅提供自己想法的分享,勿抄襲

現在你的任務是從金字塔的頂端向金字塔的底端收集鑽石,並且盡可能收集價值高的鑽石,但是只能從一塊磚斜向左下或斜向右下走到另一塊磚上,如從上圖從用紅色a標記的磚走向用藍色b標記的磚上。富翁希望heimengnan找到乙個收集最**值鑽石的路線,並且把可能收集的最大價值告訴富翁。heimengnan想了半天也沒想出好方法,聰明的你能幫助他嗎?

首先檢視深度搜尋的過程(如下圖),我們可以發現每一條路徑上的值都有重複計算的值,那麼採取記憶化搜尋即可。

我們將上述結構儲存為以下形式

那麼原圖每乙個點都有兩個向下走的方向,那麼我們新的圖可將向下走模擬原圖向左走,向右下走模擬原圖向右走,那麼即可實現儲存結構的轉換。

此外,使用乙個陣列進行儲存每一行的價值,按順序從上到下,從左到右儲存(如下圖)。

那麼如何實現一次遍歷得出最優結果呢?

當然離不開儲存值。

如果只有兩層三個值:

毫無疑問,5 + 1 = 6, 5 + 3 = 8,價值8最大

只有三層:

那麼很明顯,我們可以直接俄借助剛才已經計算過的到達a[2]最大值為6,到達a[3]最大值為8,那麼計算到達a[4 to 6]就可以直接利用這兩個最大值,得到如下**形式:

那麼,思路很明顯了。我們只需要遍歷每乙個值,如節點a[i],我們需要更新子節點a[i + down]a[i + rightdown]的值,並且每次賦值時,如果是可以增大價值則更新,否則不更新。

建立三個陣列

value[

] 儲存價值

beifenvalue[

] 價值備份

fangxiang[

] 方向(為0表示value[i]被正上方節點更新,1表示value[i]被左上方節點更新)

表示式

//尋找路徑並輸出

string route ="";

for(

int i = exit; cnt !=

0; route =

(to_string

(i)+

" ")

+ route,

(i =

(fangxiang[i]

&& i !=1)

? i - cnt -

1: i - cnt)

,cnt--);

route =

"1 "

+ route;

cout<<

"路徑為:"

<< route << endl <<

"最大值為:"

北郵 矩陣冪

給定乙個n n的矩陣,求該矩陣的k次冪,即p k。第一行 兩個整數n 2 n 10 k 1 k 5 兩個數字之間用乙個空格隔開,含義如上所示。接下來有n行,每行n個正整數,其中,第i行第j個整數表示矩陣中第i行第j列的矩陣元素pij且 0 pij 10 另外,資料保證最後結果不會超過10 8。對於每...

北郵OJ打牌

牌只有1到9,手裡拿著已經排好序的牌a,對方出牌b,用程式判斷手中牌是否能夠壓過對方出牌。規則 出牌牌型有5種 1 一張 如4 則5.9可壓過 2 兩張 如44 則55,66,77,99可壓過 3 三張 如444 規則如 2 4 四張 如4444 規則如 2 5 五張 牌型只有12345 23456...

北郵OJ虛數

乙個複數 x iy 集合,兩種操作作用在該集合上 1 pop 表示讀出集合中複數模值最大的那個複數,如集合為空 輸出 empty 不為空就輸出最大的那個複數並且從集合中刪除那個複數,再輸出集合的大小size 2 insert a ib 指令 a,b表示實部和虛部 將a ib加入到集合中 輸出集合的大...