题目链接: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. virt viewer Usbredir USB重定向

    编译virt viewer之前执行的configure命令,是没有使能usb-redir相关的功能,virt viewer是否支持usbredir是完全依赖于spice-gtk的. virt view ...

  2. 转】Maven学习总结(三)——使用Maven构建项目

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4240930.html 感谢! maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使 ...

  3. jvm所占空间的配置

    http://www.cnblogs.com/mingforyou/archive/2012/03/03/2378143.html

  4. JDBC学习笔记(2)——Statement和ResultSet

    Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...

  5. 51单片机或PLC驱动3.5寸至52寸的数字TFTLCD屏、VGA接口显示器、电视机

    http://www.21easyic.com/yx/VGA%E6%8E%A7%E5%88%B6%E6%9D%BF.htm

  6. thymeleaf的url属性

    一.使用表达式形式:@{...} 例如: <a th:href="@{http://localhost:8080/gtvg/order/details}">view&l ...

  7. linux系统日常管理

    笔者在前面介绍的内容都为linux系统基础类的,如果你现在把前面的内容全部很好的掌握了,那最好了.不过笔者要说的是,即使你完全掌握了,你现在还是不能作为一名合格的linux系统管理员的,毕竟系统管理员 ...

  8. Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)

    题目链接:http://codeforces.com/contest/616/problem/C 题意就是 给你一个n行m列的图,让你求’*‘这个元素上下左右相连的连续的’.‘有多少(本身也算一个), ...

  9. C语言简单实现sizeof功能代码

    sizeof不是函数,而是运算符,C/C++语言编译器在预编译阶段的时候就已经处理完了sizeof的问题,也就是说sizeof类似于宏定义. 下面给出一个sizeof的一个宏定义实现版本 #defin ...

  10. WinForm开发浏览器,WebBrowser获取页面内容,如何解决中文乱码

    WebBrowser的编码可以从文档对象中获得,将代码改为如下即可. System.IO.StreamReader getReader = new System.IO.StreamReader(thi ...