uva1631(DP记忆化搜索)

该博客介绍了如何使用记忆化搜索(DP)解决一个关于密码锁旋转的最小步数问题。博客中展示了如何通过定义状态并进行递归搜索,找到从初始状态到目标状态所需的最小旋转次数。
摘要由CSDN通过智能技术生成
/*
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值