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 密码锁的更多相关文章

  1. UVA - 1631 Locker(密码锁)(dp---记忆化搜索)

    题意:有一个n(n<=1000)位密码锁,每位都是0~9,可以循环旋转.每次可以让1~3个相邻数字同时往上或者往下转一格.输入初始状态和终止状态(长度不超过1000),问最少要转几次. 分析: ...

  2. uva 1631

    1631 Locker A password locker with N digits, each digit can be rotated to 0-9 circularly. You can ro ...

  3. UVa 1631 Locker (DP)

    题意:有一个 n 位密码锁,每位都是0-9,可以循环旋转.同时可以让1-3个相邻数字进行旋转一个,给定初始状态和目状态,问你最少要转多少次. 析:很明显的一个DP题.dp[i][j][k] 表示前 i ...

  4. 【Uva 1631】Locker

    [Link]: [Description] 有一个n(n≤1000)位密码锁,每位都是0-9,可以循环旋转.每次可以让1-3个相邻 数字同时往上或者往下转一格.例如,567890->567901 ...

  5. UVA - 1631 Locker 记忆化搜索

    题意:给定两个密码串,每次可以让1~3个相邻的密码向上或者向下滚动,每个密码是 ,问最少需要多少次滚动可以让原串成为目标串? 思路:假设当前要让第i位密码还原,我们可以同时转动,不同的转动方式会影响后 ...

  6. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  7. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  8. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  9. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

随机推荐

  1. spring boot 中用@value给static变量赋值

    需求:改写一个JedisUtils,工具类,所以最好用静态方法和变量. @value("${redis.host}") private static String redisHos ...

  2. 十天精通CSS3(1)

    什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...

  3. for练习相关

    for嵌套: 大圈套小圈思想:有一种重复的情况而这种情况每一次对应另外情况多次. ------------------------------------------------------- 例如: ...

  4. 性能测试之nmon对linux服务器的监控

    大家都知道在做性能测试的时候,需要监控服务器的资源情况,而大多数服务器是Linux系统,网上资料嘿多,这里汇总介绍下Nmon监控工具: -------------------------------- ...

  5. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

  6. jquery控制css的display属性(显示与隐藏)

    jquery控制div的显示与隐藏,很方便的. 例如: $("#id").show()表示display:block, $("#id").hide()表示dis ...

  7. STA分析(六) cross talk and noise

    在深亚微米技术(deep submicron)中,关于crosstalk和noise对design的signal integrate的影响越来越大.主要表现在glitch和对delay的影响. 1)m ...

  8. liunx anacoda 安装pyltp

    anacoda 默认的gcc是4.7需要更新 https://anaconda.org/nlesc/gcc 更新之后再安装即可. 报错: /usr/lib64/libstdc++.so.6: vers ...

  9. Rpgmakermv(4 )doc of TerraxLights

    我只做简要翻译. To activate the script in an area, do the following: 1. Put an event switch into the map. 2 ...

  10. 对使用wordpress做开发的童鞋的提醒

    [1.]WordPress 4.7.2 以及之前的所有版本都存在以下6个安全问题:记得及时升级啊. 通过媒体文件的元数据的跨网站脚本(XSS)控制字符可以欺骗重定向网址验证管理员可以使用插件删除功能删 ...