本博主僅提供自己想法的分享,勿抄襲
現在你的任務是從金字塔的頂端向金字塔的底端收集鑽石,並且盡可能收集價值高的鑽石,但是只能從一塊磚斜向左下或斜向右下走到另一塊磚上,如從上圖從用紅色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加入到集合中 輸出集合的大...