記憶化搜尋理解和最短路結合

2021-09-25 20:27:25 字數 1238 閱讀 3010

題目大意:有n個位置,辦公室在1位置,家在2位置,給出m條雙向邊,現在需要從1到2,但是從a到b有乙個條件就是,存在一條b到家的路徑長度小於任意一條a到家的路徑長度(即d[b]第一次接觸記憶化搜尋這個東西,還是先感受一下大概的意思

1.斐波那契

非記憶化

ll f(ll x)

{ if (x==

1||x==2)

return1;

else

return

f(x-1)

+f(x-2);

記憶化

dp陣列用來「記憶」f(x)的值,如果已經算過了,那麼就可以直接拿來用,也不用再一層層遞迴了,拿個例子來講,辛辛苦苦算了f(50)和f(51),如果要算f(52),用記憶化搜尋直接答案就出來了dp[52]=dp[50]+dp[51],但是如果不用記憶化就得再進行好多好多次的遞迴.

memset

(dp,0,

sizeof dp)

;ll f

(ll x)

2.階乘

非記憶化

ll fact

(int x)

記憶化

memset

(dp,0,

sizeof dp)

;ll fact

(ll x)

3.回歸正題

我們現在可以先算出家(2)到其他點的最短距離,跑乙個spfa或者dijkstra即可,大不了套個板子就行了,然後用記憶化搜尋的方法,dp[x]表示經過x一共有幾條路徑

int

dfs(

int x)

return dp[x]

=cnt;

//這個加和就是最終這個點的路徑數量,記憶一下

}

找了一下網上大神的解釋,感覺解釋的很好啊

int

dfs(

int x)

else

}

總結一下,記憶化搜尋可以減少一些不必要的計算,當資料範圍比較大並且說有很多資料會重複計算的時候,用記憶化搜尋可以大大增加效率

(雖然不知道下一次碰到能不能用上,但是至少稍微了解了一點菊部0.0)

1106 最優對稱路徑(最短路 記憶化搜尋)

submit page summary time limit 1 sec memory limit 128 mb submitted 486 solved 135 給乙個n行n列的網格,每個格仔裡有乙個1到9的數字。你需要從左上角走到右下角,其中每一步只能往上 下 左 右四個方向之一走到相鄰格仔,不...

NOIP 2017 逛公園(最短路 記憶化搜尋)

肯定要先跑一次最短路 題目中的k 相當於允許我們走k距離的 冤枉路 回想之前有些題是如何判斷哪些邊是屬於最短路上的 當dis now edge u val dis vis 這條邊就在最短路上 類似的 我們可以得出 dis now edge u val dis vis 就是這一次走的 冤枉路 的長度 ...

hdu 1142 最短路 記憶化

最短路 記憶化搜尋 hdu 1142 a walk through the forest 題意 找出不同的路徑條數,假如jimmy要從a走到b的話滿足jimmy從b到家的距離比從a到家的距離短 這樣我們可以通過最短路演算法,找出從家 看成源點 到各個點的最短路徑長度,記做d v 然後就可以從起點 o...