UVa 1631 密码锁
https://vjudge.net/problem/UVA-1631
题意:
有一个n位密码锁,每位都是0~9,可以循环旋转。每次可以让1~3个相邻数字同时往上或者往下转一格。输入初始状态和终止状态,问最少要转几次。
思路:
d[i][x][y][z]表示当前在复原第 i 位,当然前 i 位已经复原完毕,x代表第 i 位的数字,y代表第 i+1的数字, z代表第 i+2 的数字时的最少旋转次数。
每次我们需要复原第 i 位的数字,因为可以向上旋转和向下旋转2种方式,所以我们需要分别计算出向上和向下各需要旋转几下。接下来考虑 i+1 和 i+2 ,他们这两位可以跟着第 i 位一起旋转,也可以不旋转。所以我们需要枚举来讨论。但是,可以肯定的是,i+1 的旋转次数肯定是小于等于 i 的旋转次数的,同时,i+2 的旋转次数又是小于等于 i+1 的旋转次数的。
代码不难,就是一个记忆化搜索。
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = + ;
const int INF = ; char s1[maxn], s2[maxn];
int a[maxn], b[maxn];
int d[maxn][][][];
int len; int dp(int cur, int x, int y, int z )
{
if (cur >= len) return ;
int& ans = d[cur][x][y][z];
if (ans!=-) return ans;
ans = INF; //向上旋转
int t;
if (x <= b[cur]) t = b[cur] - x;
else t = b[cur] + - x; for (int j = ; j <= t;j++)
for (int k = ; k <= j; k++)
ans = min(ans, dp(cur + , (y + j) % , (z + k) % , a[cur+] ) + t); //向下旋转
if (x >= b[cur]) t = x - b[cur];
else t=x + - b[cur];
for (int j = ; j <= t; j++)
for (int k = ; k <= j; k++)
ans = min(ans, dp(cur + , (y - j + ) % , (z - k + ) % , a[cur+] )+t); return ans;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (cin >> s1 >> s2)
{
memset(d, -, sizeof(d));
len = strlen(s1);
for (int i = ; i < len; i++)
{
a[i] = s1[i] - '';
b[i] = s2[i] - '';
}
a[len] = a[len + ] = b[len] = b[len + ] = ;
cout << dp(, a[], a[],a[]) << endl;
}
return ;
}
UVa 1631 密码锁的更多相关文章
- UVA - 1631 Locker(密码锁)(dp---记忆化搜索)
题意:有一个n(n<=1000)位密码锁,每位都是0~9,可以循环旋转.每次可以让1~3个相邻数字同时往上或者往下转一格.输入初始状态和终止状态(长度不超过1000),问最少要转几次. 分析: ...
- uva 1631
1631 Locker A password locker with N digits, each digit can be rotated to 0-9 circularly. You can ro ...
- UVa 1631 Locker (DP)
题意:有一个 n 位密码锁,每位都是0-9,可以循环旋转.同时可以让1-3个相邻数字进行旋转一个,给定初始状态和目状态,问你最少要转多少次. 析:很明显的一个DP题.dp[i][j][k] 表示前 i ...
- 【Uva 1631】Locker
[Link]: [Description] 有一个n(n≤1000)位密码锁,每位都是0-9,可以循环旋转.每次可以让1-3个相邻 数字同时往上或者往下转一格.例如,567890->567901 ...
- UVA - 1631 Locker 记忆化搜索
题意:给定两个密码串,每次可以让1~3个相邻的密码向上或者向下滚动,每个密码是 ,问最少需要多少次滚动可以让原串成为目标串? 思路:假设当前要让第i位密码还原,我们可以同时转动,不同的转动方式会影响后 ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
随机推荐
- vue.set的用法
Vue.set(this.food,'count',1) //就是给this.food里面添加一个count的属性,并且赋值为1
- HTML5-Canvas 初认识
1. 理解canvas canvas其实是HTML5中一个新增加的标签,对于canvas标签本身并没有什么非常强大的属性(width.height.id.class.style),仅仅作为一个画布存在 ...
- vue学习之npm
任何一门计算机语言都包含了丰富的第三方库,npm就是JavaScript这门语言的第三方库管理工具,本文详细介绍了JavaScript的包管理工具,npm. 在计算机中安装好Node.js之后,默认已 ...
- [lr] 基本色调调整和色调曲线
基本色调调整 • 曝光度调整 ▶ 控制区域 在Lightroom中,软件提示我们曝光控制的是如图中间调的区域.我们把鼠标移动到曝光工具条上,软件会提示我们这个区域: ▶ 实际效果 ▪ 增加曝光值 增加 ...
- RAC禁用DRM特性
查看"_gc"开头的隐藏参数值: set linesize 333 col name for a35 col description for a66 col value for a ...
- JavaScript DOM2
1.Window.history:window.open打开网页的方式必须是_self window.history.back()后退 Window.history.forward()前进 <b ...
- tfs使用流程
1.用邮箱注册个微软账号,如zhangsan@outlook.com等邮箱 2.管理员会添加此用户zhangsan@outlook.com 3.打开vs,team-tfs-connect to ser ...
- Object-C-NSFileManager
+(NSFileManager *)defaultManager;//获得文件管理对象 -(BOOL)createFileAtPath:(NSString *)path contents:(NSDat ...
- Java获取配置文件跟路径
一直以为使用new File(相对路径)可以读取class目录下的文件,其实不然.网上查询了一些资料,弄清楚了原理,总结如下: package com.coshaho.learn; import ja ...
- 百度云盘-真实地址 F12 控制台
$.ajax({ type: "POST", url: "/api/sharedownload?sign="+yunData.SIGN+"&t ...