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

这是一道2012年ACM天津赛区现场赛的题目,大意是给出两串数字,求用最少的转换次数将一串(A)变为另一串(B)。
转换规则是:可以将连续的1到3位数字都加一或者减一(0-9的数字是循环的,0减一变9,9加一变0)

本题的数字串的长度最大有1000,光用搜索是不行的了,正解是DP

DP[i][j][k]表示前i-2个数字与目的串的相同,且第i-1位为j , 第i 位为k 的最小变换次数。

那么状态的转移就是 DP[i][j][k]=min{DP[i-1][ X ][ Y ]+dis(A[i],K)} ,其中dis(A[i],K)表示从A[i]变为K所需的变化次数,不难知道变化可以往上变化,也可以往下变化,所以有两种情况;X表示在变化次数不超过dis(A[i],K)和Y的变化次数的情况下能变成B[i-2] 的数字,Y表示在变化次数不超过dis(A[i],K)的情况下能变成 J 的数字,X和Y都需要根据当前dis(A[i],K)的计算状态(向上向下)来定。

X、Y的变化次数有所限制,是以第i位的变化次数为标准,这样可以保证枚举到所有连续变化的情况,比如说234的次数和444的次数是一致的。对于每一位数都能找到一种满足这种条件的方案使得穷尽与这位和相临的2位的各种组合情况。

这题能用动态规划的关键是每次变化的数字位一定是连续的,这为无后效性和最优子结构提供支持。状态的转移比较麻烦。

代码:

 #include <stdio.h>
#include <string.h>
char a[],b[];
int dp[][][];
bool ifv[][][];
inline int min(int a,int b){return a<b?a:b;}
void deal(char *p)
{
int n=strlen(p);
for (int i=;i<n;++i) p[i]-='';
}
int dps(int ii,int jj,int kk)
{
if (ii<) return min((kk-a[ii]+)%,(a[ii]-kk+)%);
if (ifv[ii][jj][kk]) return dp[ii][jj][kk];
ifv[ii][jj][kk]=true;
dp[ii][jj][kk]=;
int tem=(kk-a[ii]+)%;
for (int i=;i<=tem;++i)
for (int j=;j<=i;++j)
{
dp[ii][jj][kk]=min(dp[ii][jj][kk],dps(ii-,(b[ii-]-j+)%,(jj-i+)%)+tem);
}
tem=-tem;
for (int i=;i<=tem;++i)
for (int j=;j<=i;++j)
{
dp[ii][jj][kk]=min(dp[ii][jj][kk],dps(ii-,(b[ii-]+j)%,(jj+i)%)+tem);
}
return dp[ii][jj][kk];
}
int main()
{
//freopen("in.txt","r",stdin);
while (~scanf("%s%s",a,b))
{
memset(dp,,sizeof dp);
memset(ifv,,sizeof ifv);
int len=strlen(b);
deal(a);deal(b);
printf("%d\n",dps(len-,b[len-],b[len-]));
}
}

HDU 4433 locker的更多相关文章

  1. HDU 4433 locker(12年天津,DP)

    4576 njczy2010 C Accepted 860 KB 140 ms G++ 2063 B 2014-10-16 09:51:19 哎,为啥1000*100*100的复杂度的dp就不敢敲了呢 ...

  2. HDU 4433 locker(DP)(2012 Asia Tianjin Regional Contest)

    Problem Description A password locker with N digits, each digit can be rotated to 0-9 circularly.You ...

  3. HDU 4433 locker(SPFA+DP)

    题目链接 去年区域赛的题目,早就看过题目了,又是过了好久了... 这题状态转移,一看就知道应该是 线性的那种,不过细节真的不好处理,一直没想出怎么搞,期间也看过题解,好像没太看懂... dp[i][j ...

  4. [HDU 4433]locker[DP]

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

  5. HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP

    意甲冠军:给定的长度可达1000数的顺序,图像password像锁.可以上下滑动,同时会0-9周期. 每个操作.最多三个数字连续操作.现在给出的起始序列和靶序列,获得操作的最小数量,从起始序列与靶序列 ...

  6. hdu 4433

    一道dp题,虽然知道是dp,但是不会做: 学习了ACM_cxlove大神的代码,终于明白了: 搬运工: dp[i][j][k]表示 前i个已经完全匹配,而这时候,第i+1个已经加了j位,第i+2位已经 ...

  7. dp hdu-4433 locker

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

  8. hdu 6253 (bfs打表)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6253 题意: 马可以往一个方向走两步,然后转个弯走一步,这样算一次动作,求问马n次动作后,能到达多少个点, ...

  9. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. HDU 5724 Chess (sg函数)

    Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5724 Description Alice and Bob are playing a s ...

  2. HTML5新增的CSS类API

  3. HDU/杭电2013多校第三场解题报告

    今天悲剧了,各种被虐啊,还是太年轻了 Crime 这道题目给的时间好长,第一次就想到了暴力,结果华丽丽的TLE了. 后来找了一下,发现前24个是1, 2, 6, 12, 72, 72, 864, 17 ...

  4. C++ API设计

    <C++ API设计> 基本信息 作者: (美)Martin Reddy    译者: 刘晓娜 臧秀涛 林健 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:97871153 ...

  5. Javascript高级篇-面向对象的特性

    一.创建对象 1.1初始化器 var any={ name:"some", age:10, action:function(){ alert(this.name+":&q ...

  6. hibernate一对多关系配置

    一.     表信息 公司表 cId cName cAdress Null Null Null 表t_company 员工表 sId sName sAge cId Null Null Null Nul ...

  7. 框架学习笔记:深度解析StrangeIoC内部运行机制

    StrangeIoC的设计和RobotLegs一致,所以我的解析会对照RobotLegs来看. 整个框架使用的是MVCS的模式,关于MVCS模式大家可以点这里进行查看,这里就不谈了,既然Strange ...

  8. iOS类别(Category)

    iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最 ...

  9. 漫谈云计算与SOA (1)

    SOA是什么? 英语直译是基于服务的架构,就是一种技术框架,促使企业内部与外部所有相关的系统公开和访问定义良好的服务和绑定于服务的信息,进一步抽象成流程层和组合应用,从而构成解决方案. 说人话:重用服 ...

  10. Mybatis学习之配置文件

    Mybatis也是ORM框架的一种,与Hibernate框架的不同就是Hibernate框架是实体与表的映射,是一种全自动的ORM实现,而Mybatis是实体与sql语句的映射,是一种半自动的ORM映 ...