题目:http://acm.hdu.edu.cn/showproblem.php?pid=4433

题目大意:就是给你一个序列,相当于一个可以转的那种密码锁的初始状态,0往下转是9,9往上转是0,现在你要把它转成一个指定的序列,每次可以转动连续的1~3个数字,问你最小的操作数。

思路:DP题这是很清楚的,可是状态有点不好设计。设d[ i ][ x ][ y ] 表示前 i 个已经转好,然后 i+1 转成 x,i+2 转成 y 的最小步数,然后这个状态只能由 i-1 转换过来(这个自己想想就知道了),那么把 from[ i ] 转成 to[ i ] ,可能往上转,可能往下,然后这样就把 i 配对好了,i 可能带动 i+1 和 i+2,,i+1 的那里是y,i+2 那里是 from[ i+2 ],设 i 匹配的步数为 p,那么p >=  i+1 那里带动的步数 >= i+2 那里带动的步数,然后枚举这些步数,就可以完成状态转移,具体参见代码吧!

2012 天津现场的一道题,当时记得很清楚,这道题一直卡到死。。。 现在回过头来再做,说实话,我也是看了解题报告才A了的,自己仍旧没想出来。。  今天做的时候的思路包括当时现场赛时的思路,就是有一个地方一直没弄清楚。我都只想到了一维d[ i ],用来表示前 i 个的最小步数,然后转1~3个进行转移,但是第二个样例怎么也弄不出来,其实这里有一个漏洞,就是当我们旋转第 i 个的时候,i+1、i+2 那里是有可能也顺手去转动一下的,所以说一维的这样设计算出来肯定是多的。相当于是有了后效性,由于第 i 个它只能影响后两个,所以再增设两维,用于表示顺手带动的后面两个的状态,这样就消除了后效性,唉,关键就是这里啊!

真是一道不错的题目啊!

代码如下:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;const int INF = 0x0fffffff;const int MAXN = 1111;char from[MAXN],to[MAXN];int d[MAXN][11][11];int main()
{from[0] = to[0] = 0;while(~scanf("%s%s",from+1,to+1)){int len = strlen(from+1);for(int i = 1;i <= len;i++){from[i] = from[i]-'0';to[i] = to[i]-'0';}from[len+1] = to[len+1] = from[len+2] = to[len+2] = 0;for(int i = 0;i <= len;i++)for(int j = 0;j < 10;j++)for(int k = 0;k < 10;k++)d[i][j][k] = INF;d[0][from[1]][from[2]] = 0;for(int i = 0;i < len;i++){for(int x = 0;x < 10;x++)for(int y = 0;y < 10;y++){if(d[i][x][y] >= INF) continue;int down = (x-to[i+1]+10)%10;for(int j = 0;j <= down;j++)for(int k = 0;k <= j;k++){d[i+1][(y-j+10)%10][(from[i+3]-k+10)%10] = min(d[i][x][y]+down,d[i+1][(y-j+10)%10][(from[i+3]-k+10)%10]);}int up = (to[i+1]-x+10)%10;for(int j = 0;j <= up;j++)for(int k = 0;k <= j;k++){d[i+1][(y+j)%10][(from[i+3]+k)%10] = min(d[i][x][y]+up,d[i+1][(y+j)%10][(from[i+3]+k)%10]);}}}printf("%d\n",d[len][0][0]);}return 0;
}

hdu 4433 locker(DP)相关推荐

  1. HDU 2340 - Obfuscation(dp)

    题意:一个句子中有多个单词,但是目前的单词,除了首末两位,中间的单词字母顺序均被打乱,并且打乱后把单词间的空格删掉变成一个新句子.现在给定这个新句子(长度为1~1000),给定n个单词(1 <= ...

  2. HDU 2340 Obfuscation(dp)

    题意:已知原串(长度为1~1000),它由多个单词组成,每个单词除了首尾字母,其余字母为乱序,且句子中无空格.给定n个互不相同的单词(1 <= n <= 10000),问是否能用这n个单词 ...

  3. HDU 2059 龟兔赛跑(DP)

    题意   中文 简单的多阶段决策DP   令p[0]=0   p[n]=l   d[i]表示乌龟从起点到第i个加油站所需的最小时间   那么有d[i]=min(d[i],d[j]+t(j,i))   ...

  4. hdu 2154 跳舞毯 (DP)

    点击打开链接 dp[i]=dp[i-1]+2*dp[i-2] #include"stdio.h" int main() {__int64 dp[1005];int i;int n; ...

  5. HDU 1248 冰封王座(dp)

    Problem Description 不死巫妖王拉工资,死亡骑士得到N美元的钞票(记,只有一个纸币),战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡骑士:"我要买 ...

  6. HDU 2859 Phalanx(DP)

    基础DP #include<iostream> #include<algorithm> #include<cstring> #include<string&g ...

  7. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  8. HDU-1284:钱币兑换问题 推理+动态规划(dp)

    文章目录 题目大意: 题目链接HDU 1284(点击可进入网页提交) 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. 输入: 每行只有一个正整数N, ...

  9. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

最新文章

  1. 算法导论一个让人很不爽的地方
  2. php访问父类变量,php – 如何使用parent :: method访问父类中的变量
  3. Spring Boot 最佳实践(三)模板引擎FreeMarker集成
  4. 电脑dns_女生也能学会的修电脑技巧
  5. 7月最强书单丨博文视点新品畅销TOP10,让技术带你燃爆整个7月
  6. 【翻译】Geometric Features-Based Parking Slot Detection
  7. 【Django 2021年最新版教程23】2个日期相减 计算天数 xxxx-xx-xx格式
  8. 计算机03年word做母亲节贺卡,制作图文并茂的作品---用word制作母亲节贺卡PPT课件...
  9. 教你如何删除顽固文件
  10. 怎样下载ImageNet数据集并使用?
  11. 2021年最新Android面试点梳理,成功入职腾讯
  12. 应届生如何获取招聘信息
  13. 软件工程中众包应用的综述
  14. ASP.NET 2.0收集
  15. 【长按图片保存到相册】Vue移动端H5页面实现长按图片保存到手机功能
  16. 详解编码器和解码器电路:定义,工作原理,应用,真值表
  17. [license]MIT,BSD,Apache几种开源协议之间的区别
  18. 使用【阿里云】API接口进行手机号(三网)实名认证
  19. 如果房价暴跌,银行会没收你的房子吗?
  20. 三星折叠机即将上市,华为折叠机在何方?

热门文章

  1. docker版本实现MySQL主从架构
  2. LTE峰值1Gbps传输速率之路
  3. 与2000人2年读完5本R语言经典书籍
  4. JS简单实现随机颜色验证码功能
  5. SLAM14讲第七讲习题10:Ceres实现ICP优化
  6. Oracle 11g ora 15018,ORA-15018: diskgroup cannot be created
  7. [Hook技术]利用inlineHook来实现快速破解易语言程序
  8. java socket 通信协议_java 基于TCP协议的Socket编程和通信
  9. Stream流获取(集合,数组)
  10. git使用MERGING处理