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