記憶化搜尋 vijos1547

2021-07-14 23:18:19 字數 1002 閱讀 7642

雖然在 vj 分類中被定義為記憶化搜尋,但是,實在是找不出**體現了記憶化,最多加個剪紙優化。

一開始所有的車子都是在1號城市中的。

搜尋過程是這樣的:

用陣列 way[i][j] 表示從城市 i 到城市 j 的路程,因為不會有回頭路,反向邊初始化為無窮大;

用 ans 保留目前最優解;

void dfs(int now, int a, int b, int c, int len); 表示目前到達編號最大的城市是now,三輛車子分別在a,b,c三個城市中,目前已經走過len長度的路程;

以now為搜尋主線,每一層now+1,列舉哪一部車子到城市now+1;

如果now==n,則已經到達所有的城市,則ans = min(ans,len)。

#include using namespace std;

int way[110][110];

int n;

int ans;

void dfs(int now, int a, int b, int c, int len)

dfs(now+1, now+1, b, c, len+way[a][now+1]); //讓第一部車子到達城市now+1,另外兩部不動,那麼路程就加上way[a][now+1]。下面的類似

dfs(now+1, a, now+1, c, len+way[b][now+1]);

dfs(now+1, a, b, now+1, len+way[c][now+1]);

}int main()

{ for (int i=0; i<=100; i++)

for (int j=0; j<=100; j++) way[i][j] = (1<<30);

cin>>n;

for (int i=1; i<=n; i++)

for (int j=i+1; j<=n; j++) cin>>way[i][j];

ans = (1<<31)-1;

dfs(1,1,1,1,0);

cout<

Vijos 1547 逆轉,然後再見

上屆的高三在這個暑假終於要到各個城市奔向他們的大學生活了。奇怪的是學校這次異 常闊氣,說要用三颱車子去載他們上學。上屆高三的師兄們異常興奮 可惜的是臨行的時 候,學校終於露出它 猙獰 的面孔 一 油費要學生自己給 二 去第k 個城市的條件是,前k 1 個城市都要被去過 三 同時只能有一部車子在動 師...

記憶化搜尋 vijos 1599 貨幣

又是一道水題 在某個神秘的星球上有一種貨幣,它有一種奇怪的兌換規則 你有且僅有一枚面值為n的金幣,你可以去銀行進行兌換,也可以不兌換 如果去銀行兌換,兌換的規則是這樣的 用面值為a的金幣去兌換可以換到a 2,a 3,a 4這三枚硬幣 如果 是小數則截尾取整 你可以兌換多次 讀入n輸出你最後最多能擁有...

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...