题目链接:

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

题目大意:

给两个长度相等的数字串s1,s2。每次操作可以把连续的最多三位都+1或-1,如果超过9则变成0,如果小于0则变成9.问从s1到s2最少的步数。

解题思路:

每一位移动正确最多5位,如果一位一位的移动最多需要1000*5=5000 。

长度有1000太大,不能直接用BFS。

因为每次改变最多只影响3位,前面的i-3位不改变,所以可以设dp[i][j][k]表示处理到了第i位,且最后两位分别为j,k时,前面的i-2位为原串s1时,达到最终的s2的前i位时移动的最小的步数。

转移时,先把第i位移动正确,然后枚举在移动第i位时,前面两位可能到达的状态,此时第i-2位移动的步数要小于等于第i-1位的,第i-1位的要小于等于第i位的,然后根据dp[i-1]的状态更新dp[i]的状态。

比如有三位分别需要移动2 3 4位  第3位需要移动4位,在移动第3位时,可以先都移动2位,然后再后两位移动1位,最后一位再移动一位。

这类的dp做的比较少,以后多分析各种状态。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;/*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
#define Maxn 1100
//最多只有1000*5
int dp[Maxn][12][12]; //dp[i][x][y]表示处理到了当前i位,且最后两位是x和y的,转到最后的i位所需的最小步数
int a[Maxn],b[Maxn];
char sa[Maxn];int main()
{while(~scanf("%s",sa)){int n=strlen(sa);for(int i=1;i<=n;i++)a[i]=sa[i-1]-'0';scanf("%s",sa);for(int i=1;i<=n;i++)b[i]=sa[i-1]-'0';memset(dp,INF,sizeof(dp));dp[0][0][0]=0;for(int i=1;i<=n;i++){for(int x=0;x<=9;x++){if(i==1&&x) //只有1位的话全部处理为x=0的情况continue;for(int y=0;y<=9;y++){int up=(b[i]-y+10)%10; //当前位一定要达到要求int dow=(y-b[i]+10)%10;if(i==1) //此时x一定为0dp[i][x][y]=min(up,dow);else if(i==2){int xx=0; //i-2位置为0,表示只有一位的情况for(int j=0;j<=up;j++) //正转{int yy=(x+j)%10; //在当前位达到要求时,前面一位最多可以移动up位dp[i][x][y]=min(dp[i][x][y],dp[i-1][xx][yy]+up);}for(int j=0;j<=dow;j++) //反转{int yy=(x-j+10)%10;dp[i][x][y]=min(dp[i][x][y],dp[i-1][xx][yy]+dow);}}else //枚举 操作第i位up或dow时,第i-1位和第i-2位能够到达的状态{for(int j=0;j<=up;j++) //2 3 4 先三个移动2 再后面两个移动1 最后一个再移动1for(int p=j;p<=up;p++) //必须满足第i-1位移动的大于等于第i-2位,{int xx=(a[i-2]+j)%10;int yy=(x+p)%10;dp[i][x][y]=min(dp[i][x][y],dp[i-1][xx][yy]+up);}for(int j=0;j<=dow;j++)for(int p=j;p<=dow;p++){int xx=((a[i-2]-j)+10)%10;int yy=(x-p+10)%10;dp[i][x][y]=min(dp[i][x][y],dp[i-1][xx][yy]+dow);}}}}}if(n==1)printf("%d\n",dp[1][0][a[1]]);elseprintf("%d\n",dp[n][a[n-1]][a[n]]);}return 0;
}

dp hdu-4433 locker相关推荐

  1. hdu 4433 locker(DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4433 题目大意:就是给你一个序列,相当于一个可以转的那种密码锁的初始状态,0往下转是9,9往上转是0,现在 ...

  2. [HDU 4433]locker[DP]

    题意: 给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数. 思路: 首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位 ...

  3. hdu 4433 locker

    http://acm.hdu.edu.cn/showproblem.php?pid=4433 记忆化搜索+DP ans[x][f][ff]; 表示到a的第x位时 此位加f ,x-1位 加ff 的情况下 ...

  4. ACM练级日志:HDU 4433 Locker

    天津现场赛的一道题,说有两个密码串,每次你可以转第一个串连着的最多三个数,问最少转多少次能把第一串转成第二串. 开始以为是搜索,后来一看n<=1000直接吓尿-- 后来以为是字符串,但是怎么做也 ...

  5. HDU 4433 locker

    很暴力的一个dp,dp[i][j][k] 表示的是第i位时,前i-1位都匹配后,当由前面的状态推出第i位+j,i+1位+k时最少用多少步.注意up和down要分开算.. #include<alg ...

  6. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  7. UVA 1631 Locker(HDU 4433)(DP)

    A password locker with N digits, each digit can be rotated to 0-9 circularly. You can rotate 1-3 con ...

  8. HDU 4433 DP

    题意 给1000个数字,每次可以转动1-3连续位,问从一个状态转到另一个状态最少需要多少步. 题解 比赛时候想复杂了,这道题跟BFS没有任何关系.不过还是有很多神牛用记忆化搜索过了.主要就是设计DP状 ...

  9. HDOJ 4433 Locker (数位DP)

    题意,给一个密码锁的初始状态和目标状态,每次可以将连续的 1 - 3 位向上或者向下挪一位,问达到目标状态最少需要多少次. 参考了网上的题解... dp[i][x][y] 表示 在第 i-1 位是 x ...

  10. 树形DP——HDU 1011 Starship Troopers

    HDU 1011 Starship Troopers 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1011 作为星河战队的领导者,你被派去摧毁这些虫子的基 ...

最新文章

  1. 2020.12.07.记录
  2. java异常处理图片_Java处理图片时出现异常
  3. 函数最值题目及答案_呆哥数学每日一题 ——多元函数求最值
  4. pyqt控件显示重叠_Python编程:一个不错的基于PyQt的Led控件显示库,建议收藏学习...
  5. C# winform对话框用法大全收藏
  6. Linux 关闭网络管理服务
  7. 【转】context和getApplicationContext()介绍
  8. FL Studio20.8中文完整版本覆盖升级更新说明介绍v20.8.3
  9. C# 2.0中泛型编程初级入门
  10. Spyder汉化(python汉化)
  11. 微信群机器人管理系统源码
  12. 新库上线 | CnOpenData制造业工商注册企业基础信息数据
  13. 2011-11-27神马浮云的一天
  14. C#之浅析面向对象编程思想(二)
  15. 浅看Redis内存回收
  16. svn版本库浏览器_WebSVN—在线版本库浏览器
  17. 第09课:生活中的工厂模式——你要拿铁还是摩卡
  18. Win95下的注册表文件(User.dat,System.dat)文件格式说明 (转)
  19. 论文笔记:SIFT(Scale-invariant feature transform 尺度不变特征变换)
  20. 股票下单软件接口的设计原则是什么?

热门文章

  1. 2022年技术人365篇写作计划-在赚钱这件事情上,人与人的差别究竟在哪里?
  2. 【问题解决方案】之 关于某江加密视频swf专用播放器仍无法播放的问题
  3. 在Ubuntu18.04中安装wps并且解决文字字体缺失的问题
  4. Polycom PVX 软件视频会议终端
  5. 强连通分支和半连通分支
  6. 第二章 关键技术介绍
  7. python粉色_在“\”后以升华形式突出显示粉红色
  8. Linux系统有啥好的,你们都去学?
  9. 【Linux】循序渐进学运维-服务篇-实验环境准备
  10. 10-01 某政府和某中央企业网站被挂的木马升级了 第2版