記憶化搜尋(跳舞機,uva 10618)

2021-07-23 00:15:48 字數 940 閱讀 3543

今天寫了好久都沒寫出來,後來看別人**才過了。

剛開始寫的時候,覺得決策十分複雜,一直在討論,寫了很長。後來列印決策的時候遇到了更大的麻煩,只好用dfs遞迴去列印。**長到**,而且還wa了。

後來看別人**,學到幾個技巧。

在dp時直接暴力列舉所有決策,然後寫乙個函式判斷是否合法即可。

能量消耗也不需要在dp時判斷,直接交給函式處理就好了。

最開始之所以wa是因為路徑儲存錯了。我只儲存了一維的路徑,其實要儲存四維的路徑,這樣才能保證記錄了所有狀態的下乙個狀態,下乙個狀態用結構體表示。

** #include#define inf 0x3f3f3f3f

using namespace std;

struct node

path[80][5][5][5];

char str[80];

int dp[80][5][5][5];

int len;

int ok(int l,int r,int nl,int nr)

int cost(int f,int t,int last,int now)

int dfs(int i,int a,int b,int s)

{ if(i==len) return 0;

int& ans=dp[i][a][b][s];

node& p=path[i][a][b][s];

if(ans>=0) return ans;

ans=inf;

if(str[i]=='.')

{ans=min(ans,dfs(i+1,a,b,0));

p.l=a,p.r=b,p.s=0;

for(int j=1;j<=4;j++)

{if(ok(a,b,j,b))

{int temp=dfs(i+1,j,b,1)+cost(a,j,s,1);

if(temp

uva 116 (記憶化搜尋)

題意 如圖,從左到右走,每次可以往左上 up 左 fo 左下 dn 走,當走到第一行或最後一行時可以如圖穿越。求一條權值最小的路徑,並列印字典序最小的路徑。解析 狀態轉移方程 dp i j min dp i 1 m m j 1 up dp i j 1 fo dp i 1 m j 1 dn 字典序最小...

uva10626(記憶化搜尋)

題目大意 一瓶可樂需要花8元,自動販售機只收1元,5元,10元。每次插入的錢只能買一瓶。給出n瓶可樂,請問最少插入幾次錢可以買到所需要數量的可樂。思路 一共有以下幾種情況 8個1元 插入8次 3個1元 乙個5元 插入4次 3個1元 乙個10元 插入4次 找5元 1個10元 插入1次 找2 1元 2個...

UVA 1629 記憶化搜尋

有乙個n行m列的蛋糕,切蛋糕,要求最後每一塊蛋糕上恰好有乙個櫻桃。問切割線總長度最小是多少?記憶化搜尋。設dp l r u d 為切割從橫向從l到r,縱向從u到d的一塊蛋糕,切割線總長度的最小值。然後不斷dfs搜尋並記錄dp值,最後dp 0 m n 0 即為所求。include include in...