/*
translation:
有一串密码锁,每次能够让相邻的1~3位数字向上或者向下旋转一格。给出目标状态和起始状态,问最少需要旋转几次?
solution:
记忆化搜索dp
令dp(int pos, int a, int b, int c)其中pos是当前的位置,a,b,c分别是pos,pos+1,pos+2上的数字。此时
pos前面的位置都已经旋转完毕,不需要再次旋转了。那么就可以求出来pos位置上需要旋转几次。再枚举pos+1,pos+2位置上
旋转的次数即可。
note:
* 一开始把这道题当成了DAG来DP解决。但是每次的记忆化搜索状态就不好记录了。
date:
2016.1.16
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <utility>
using namespace std;
const int maxn = 1005;
const int INF = 1e8;
char from[maxn], to[maxn];
int d[maxn][15][15][15];
bool vis[maxn][15][15][15];
string s1, s2;
int dp(int pos, int a, int b, int c) //pos是当前的位置,a,b,c分别是pos,pos+1,pos+2上的数字
{
int& t = d[pos][a][b][c];
if(vis[pos][a][b][c]) return t;
if(pos >= s1.length()) return 0;
int target = s2[pos] - '0', d;
if(a < target){
d = target - a; //向上旋转
for(i
uva1631(DP记忆化搜索)
最新推荐文章于 2020-01-23 18:04:42 发布
该博客介绍了如何使用记忆化搜索(DP)解决一个关于密码锁旋转的最小步数问题。博客中展示了如何通过定义状态并进行递归搜索,找到从初始状态到目标状态所需的最小旋转次数。
摘要由CSDN通过智能技术生成