牛牛的漢諾塔

2021-10-02 16:36:20 字數 1003 閱讀 2877

前面一篇博文寫了玄學的做法,今天說說正解

首先看得出來原計算過程是乙個遞迴的過程,相當於暴力求解,dfs超時就是因為包含了太多重複計算,而dp效率高在於去掉了重複計算,因此可以考慮將dfs改為記憶化搜尋,直接在原給的**中加入記憶化即可

#include #define mem(a, b) memset(a, b, sizeof a)

using namespace std;

typedef long long ll;

struct node

ll f[10];

void sum()

};node operator + (const node& a, const node& b)

return c;

}bool vis[66][4][4][4];

node dp[66][4][4][4];

int getid(char a, char b)

else if (a == 'b')

else if (a == 'c')

}node dfs(int n, char a, char b, char c)

if (n == 1)

dp[n][a - 'a'][b - 'a'][c - 'a'] = dp[n][a - 'a'][b - 'a'][c - 'a'] + dfs(n - 1, a, c, b);

dp[n][a - 'a'][b - 'a'][c - 'a'].f[getid(a, c)]++;

dp[n][a - 'a'][b - 'a'][c - 'a'] = dp[n][a - 'a'][b - 'a'][c - 'a'] + dfs(n - 1, b, a, c);

vis[n][a - 'a'][b - 'a'][c - 'a'] = 1;

return dp[n][a - 'a'][b - 'a'][c - 'a'];

}int main()

return 0;

}

牛牛的漢諾塔(記憶化搜尋)

題目傳送門 題目大概意思是給你漢諾塔的層數,要求輸出每一步的步數和總步數。總步數很好求,2 n 1,但是每一步的步數就不是那麼好求了。我最開始在草稿紙上打出了前五層的資料,只發現了有兩對會相等,其他就沒有發現了,然後我模擬漢諾塔,把各層資料打表到10,就發現了其中關係,然後找規律ac 這題的正解是記...

牛牛的漢諾塔(記憶化搜尋)

題目入口 這一題我就感覺沒有那麼簡單,剛上手就直接超時了,後來想著應該是打表找規律,後來補題看題解是用記憶化搜尋說實話,我看了半天而且還了解了解什麼是過載,心態有點崩了。其實好理解就是開乙個結構體型別的陣列dp,分別記錄路徑,如果有的話直接返回結果,說實話要自己多打幾遍可能才能懂。原題的 如下 in...

python 漢諾塔 Python漢諾塔

import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...