UVA 1631 記憶化搜尋

2021-07-27 23:16:06 字數 853 閱讀 8002

n位密碼鎖,每次可以向上或向下轉動1-3個密碼,問從初始狀態轉換到目標狀態最少需要轉動多少次。

設dp[cnt][a][b][c]為當前位為cnt時,cnt位置上的值為a,cnt+1位置上的值為b,cnt+2位置上的值為c。此時將cnt位轉動到目標狀態,向上或向下轉動,根據向上或向下轉動後轉動的次數,選擇轉動最少的轉動方式,即可得解。

#include 

#include

#include

#include

#define inf 1e9

using

namespace

std;

int anum[1010],bnum[1010];

int dp[1010][11][11][11];

int len;

int getupstep(int now,int dst)

int getdownstep(int now,int dst)

int goup(int now,int up)

int godown(int now,int down)

int dfs(int cnt,int a,int b,int c)

}for(int i=0;i<=down;i++)

}return dp[cnt][a][b][c]=ans;

}int main()

memset(dp,-1,sizeof(dp));

anum[len]=anum[len+1]=anum[len+2]=0;

printf("%d\n",dfs(0,anum[0],anum[1],anum[2]));

}return

0;}

UVa 1631 密碼鎖 (記憶化搜尋)

給定兩個數字字串,每次操作只能將相鄰的1 3位數字向上或向下旋轉1位,問從第乙個字串到第二個字串最少需要多少步。很經典的記憶化搜尋問題,用dp i a b c 表示前i 1位已經旋轉好了,第i位為a,第i 1位為吧,第i 2位為c時,將這三位旋轉好的最小移動次數。那麼首先,第i位旋轉好可以向下或向上...

UVA 1631 Locker 記憶化搜尋

題意 給定兩個密碼串,每次可以讓1 3個相鄰的密碼向上或者向下滾動,每個密碼是0 9 問最少需要多少次滾動可以讓原串成為目標串?思路 假設當前要讓第i位密碼還原,我們可以同時轉動 i i 1 i 2 i i 1 i 不同的轉動方式會影響後序的轉動,那麼可以列舉 i i 1 i 2 三個密碼的轉動情況...

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 字典序最小...