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