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

记忆化搜索+DP

ans[x][f][ff]; 表示到a的第x位时 此位加f ,x-1位 加ff 的情况下的最优解

a的x位加f后如果还不到 b[x] 然后分两种情况 一个是a的第x位不断加 直到等于b[x] 或者不断减直到等于b[x]

对于两种情况 分别枚举长度为 1 ,2 ,3的个数的情况  对下两层的影响 对下两层的影响 无论是加多少还是减多少 都可以转化为 加上一个10以内的数(因为是循环的)

然后不断递归

时间复杂度 O(N*10*10*C(12,2))  大约10^7

代码及其注释:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<string>
#include <iomanip>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1005;
int ans[N][12][12];//到第x位时 此位加f ,x-1位 加ff 时的最优解
char s1[N],s2[N];
int a[N],b[N];
int dp(int x,int f,int ff)
{if(ans[x][f][ff]!=-1)return ans[x][f][ff];int tmp=(a[x]+f)%10;//x位加 f 后的结果if(x==0){if(ff!=0)//到第0位时 -1位不能再进行加减return (ans[x][f][ff]=INF);return (ans[x][f][ff]=min((b[x]-tmp+10)%10,(tmp-b[x]+10)%10));//否则选个最优就可}if(tmp==b[x])//当前位已经不需要加减return (ans[x][f][ff]=dp(x-1,ff,0));ans[x][f][ff]=INF;int k=(b[x]-tmp+10)%10;//不断加的情况for(int i=0;i<=k;++i)for(int j=0;j<=(k-i);++j){int l=k-i-j;if(i+j+l==k)//枚举 长度1,2,3的个数的情况 对下两层的影响 求最优解ans[x][f][ff]=min(ans[x][f][ff],k+dp(x-1,(ff+i+l)%10,l));}k=(tmp-b[x]+10)%10;//不断减的情况for(int i=0;i<=k;++i)for(int j=0;j<=(k-i);++j){int l=k-i-j;if(i+j+l==k)ans[x][f][ff]=min(ans[x][f][ff],k+dp(x-1,(ff-i-l+10)%10,(-l+10)%10));}return ans[x][f][ff];
}
int main()
{//freopen("data.txt","r",stdin);while(scanf("%s %s",s1,s2)!=EOF){memset(ans,-1,sizeof(ans));int n=strlen(s1);for(int i=0;i<n;++i){a[i]=s1[i]-'0';b[i]=s2[i]-'0';}printf("%d\n",dp(n-1,0,0));}return 0;
}

转载于:https://www.cnblogs.com/liulangye/archive/2012/10/30/2746966.html

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. ACM练级日志:HDU 4433 Locker

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

  4. HDU 4433 locker

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

  5. 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 ...

  6. HDU 4433 DP

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

  7. HDOJ 4433 Locker (数位DP)

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

  8. HDU locker 4433

    #include<stdio.h> #include<algorithm> using namespace std;const int maxn=1005; const int ...

  9. dp hdu-4433 locker

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4433 题目大意: 给两个长度相等的数字串s1,s2.每次操作可以把连续的最多三位都+1或-1,如果超 ...

最新文章

  1. 整合公司3个网站后台管理子系统的经验总结 - 实现多系统的单点登录(ASP.NET + ASP)...
  2. 关于嵌入式开发,到底需要会多少门语言,做好准备了吗
  3. python手机版下载3.7.2-Python3.5.2
  4. C#并行编程中的Parallel.Invoke
  5. MyStringUtil.java String工具类
  6. 白银T+D [Ag(T+D)]业务介绍
  7. mfc 如何判断excel软件是否打开_如何从无到有地搭建一套完整的测试系统(上)...
  8. C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客
  9. ArcGIS,CC(Smart3D),ENVI....工作中常用软件的汉化包都在这,随你下载
  10. 5G无线网络关键技术
  11. Unicode(ASII)控制字符的含义
  12. 多线程操作同一个变量
  13. 《华为机试》刷题之HJ84 统计大写字母个数
  14. 数据结构之 二叉树的存储和遍历总结
  15. java基础-静态代理与动态代理
  16. 代码工具---长链接转换短链接
  17. Find命令的使用和解析
  18. PayPal开发文档整理(1)- 开发者首页
  19. 《花开半夏》--4 我等你(1)
  20. Word修改默认字体和段落的方法

热门文章

  1. 论文《PM-Huber: PatchMatch with Huber Regularization for Stereo Matching》学习
  2. 《趣学CCNA——路由与交换》——6.1节Cisco设备的管理与配置
  3. Apple Watch的对讲机功能使用教程
  4. 最全的8种 Python 程序定时任务程序!
  5. windows和linux中RabbitMQ客户端下载安装
  6. windows 安装zabbix客户端安装
  7. vscode设置编码格式的几种方法
  8. 开源项目分享-健身房管理系统
  9. oauth认证中容易被错误使用而导致的漏洞
  10. pgc解调matlab程序,时分复用光纤传感器阵列PGC解调方案最低采样频率的研究