題目入口
這一題我就感覺沒有那麼簡單,剛上手就直接超時了,後來想著應該是打表找規律,後來補題看題解是用記憶化搜尋說實話,我看了半天而且還了解了解什麼是過載,心態有點崩了。其實好理解就是開乙個結構體型別的陣列dp,分別記錄路徑,如果有的話直接返回結果,說實話要自己多打幾遍可能才能懂。
原題的**如下:
#include
using
namespace std;
const
int n=
1e5+5;
const
int mod=
1e9+7;
const
int inf=
0x3f3f3f3f
;const
double eps=
1e-6
;typedef
long
long ll;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define int long long
struct node;}
;node operator+(
const node &a,
const node &b)
//過載運算子
return c;
}node dp[5]
[5][
5][100];
int vis[5]
[5][
5][100];
//記憶化陣列,如果為1則已經標記可以直接使用
void
move
(int x,
int y,node &temp)
//記錄每一步移動的結果
node hanoi
(int a,
int b,
int c,
int n)
node temp;
temp=temp+
hanoi
(a,c,b,n-1)
;move
(a,c,temp)
; temp=temp+
hanoi
(b,a,c,n-1)
; vis[a]
[b][c]
[n]=1;
return dp[a]
[b][c]
[n]=temp;
}signed
main()
牛牛的漢諾塔(記憶化搜尋)
題目傳送門 題目大概意思是給你漢諾塔的層數,要求輸出每一步的步數和總步數。總步數很好求,2 n 1,但是每一步的步數就不是那麼好求了。我最開始在草稿紙上打出了前五層的資料,只發現了有兩對會相等,其他就沒有發現了,然後我模擬漢諾塔,把各層資料打表到10,就發現了其中關係,然後找規律ac 這題的正解是記...
牛牛的漢諾塔
前面一篇博文寫了玄學的做法,今天說說正解 首先看得出來原計算過程是乙個遞迴的過程,相當於暴力求解,dfs超時就是因為包含了太多重複計算,而dp效率高在於去掉了重複計算,因此可以考慮將dfs改為記憶化搜尋,直接在原給的 中加入記憶化即可 include define mem a,b memset a,...
漢諾塔公升級版(搜尋)
題目描述 漢諾塔公升級了 現在我們有?個圓盤和?個柱子,每個圓盤大小都不一樣,大的圓盤不能放在小的圓盤上面,個柱子從左到右排成一排。每次你可以將乙個柱子上的最上面的圓盤移動到右邊或者左邊的柱子上 如果移動之後是合法的話 現在告訴你初始時的狀態,你希望用最少的步數將第?大的盤子移動到第?根柱子上,問最...