zoukankan      html  css  js  c++  java
  • 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 的旋转次数的。

    代码不难,就是一个记忆化搜索。

     1 #include<iostream> 
     2 #include<string>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 const int maxn = 1000 + 5;
     8 const int INF = 1000000000;
     9 
    10 char s1[maxn], s2[maxn];
    11 int a[maxn], b[maxn];
    12 int d[maxn][10][10][10];
    13 int len;
    14 
    15 int dp(int cur, int x, int y, int z )
    16 {
    17     if (cur >= len)  return 0;
    18     int& ans = d[cur][x][y][z];
    19     if (ans!=-1)    return ans;
    20     ans = INF;
    21 
    22 
    23     //向上旋转
    24     int t;
    25     if (x <= b[cur])    t = b[cur] - x;
    26     else                t = b[cur] + 10 - x;
    27 
    28     for (int j = 0; j <= t;j++)
    29     for (int k = 0; k <= j; k++)
    30         ans = min(ans, dp(cur + 1, (y + j) % 10, (z + k) % 10, a[cur+3] ) + t);
    31 
    32     //向下旋转
    33     if (x >= b[cur])    t = x - b[cur];
    34     else                t=x + 10 - b[cur];  
    35     for (int j = 0; j <= t; j++)
    36     for (int k = 0; k <= j; k++)
    37         ans = min(ans, dp(cur + 1, (y - j + 10) % 10, (z - k + 10 ) % 10, a[cur+3] )+t);
    38 
    39     return ans;
    40 }
    41 
    42 int main()
    43 {
    44     //freopen("D:\txt.txt", "r", stdin);
    45     while (cin >> s1 >> s2)
    46     {
    47         memset(d, -1, sizeof(d));
    48         len = strlen(s1);
    49         for (int i = 0; i < len; i++)
    50         {
    51             a[i] = s1[i] - '0';
    52             b[i] = s2[i] - '0';
    53         }
    54         a[len] = a[len + 1] = b[len] = b[len + 1] = 0;
    55         cout << dp(0, a[0], a[1],a[2]) << endl;
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    vue router
    spring web 不定参数
    spring boot添加自定义配置文件
    IntelliJ IDEA查看方法的返回类型
    连接MySql报错->The server time zone value 'XXXXX' is unrecognized...............
    spring boot新建工程中使用mysql,com.mysql.jdbc.Driver标红
    iOS 并发编程之 Operation Queues
    数据安全基础知识总结
    登录令牌 Token 介绍
    常见加密算法
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6381174.html
Copyright © 2011-2022 走看看