题目链接:

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一定为0
dp[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 最后一个再移动1
for(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]]);
else
printf("%d\n",dp[n][a[n-1]][a[n]]);
}
return 0;
}

dp 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 locker

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4433 这是一道2012年ACM天津赛区现场赛的题目,大意是给出两串数字,求用最少的转换次数将一串(A) ...

  7. fwt优化+树形DP HDU 5909

    //fwt优化+树形DP HDU 5909 //见官方题解 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ #include <bits/ ...

  8. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  9. [状压dp] hdu 4064 Carcassonne

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4064 Carcassonne Time Limit: 3000/1000 MS (Java/Othe ...

  10. [kmp+dp] hdu 4628 Pieces

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4622 Reincarnation Time Limit: 6000/3000 MS (Java/Ot ...

随机推荐

  1. [C#]递归遍历文件夹

    /// <summary> /// 递归获取文件夹目录下文件 /// </summary> /// <param name="pathName"> ...

  2. 怎么样调试正在运行的exe?

    最近在调虚幻的编辑器的时候遇到了一个问题. 调试模式运行UE4Editor.exe 实际上只是一个带参的命令行. 打开后,它又通过这个参数生成了一份详细配置,重新调用了自己.如图 这就悲剧了,断点都没 ...

  3. ubuntu下php开发环境搭建,nginx+(cgi)php5fpm+memcached+xdebug

    由于只是开发环境,所以都是选择比较简单的apt-get安装方式 ,但中间也遇到一点问题. 首先安装nginx nginx的安装和配置其实很简单,nginx本身非常轻量级, 直接 sudo apt-ge ...

  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    关于网页中第一行<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  5. Adding the Test API in The ASP.NET Web API Help Page

    1.通过NuGet引用Web API Test Client 引用玩该DLL会生成如下文件: 这里面就是我们的帮助文档界面 2.在项目属性中进行如下设置,勾选XMl文档文件,并设置路径 3.在项目的A ...

  6. C语言实现的单链表

    链表是一种线性表,但是并不是顺序存储,而是每个节点里面存储着下一个节点的指针,把存储数据元素的数据串链起来. 单链表的基本实现: typedef int DataType;//定义单链表typedef ...

  7. FFMPEG视音频编解码零基础学习方法-b

    感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅 ...

  8. C语言写解一元二次方程程序心得

    前言:在网上看到不少解一元二次方程的小程序,在使用时总得出一大堆小数,感觉很不爽,遂自己重新写了一遍. 首先,先回忆一下一元二次方程的求根公式: 分别读取二次项.一次项和常数项系数并且求出delta ...

  9. Word2003中如何使封面和目录中不插入页码

    Word2003中如何使封面和目录中不插入页码?? 转载自: http://blog.zzedu.net.cn/user1/zhaoweijie/archives/2010/187266.html   ...

  10. 【MS Office2013小技巧】Word中公式中的等号对齐

    步骤: 1. 先将所需要对齐的公式分不同行打出来: 2. 选中所有公式,右键点击并选择“对齐点(A) =”,如图 此时,如果能够正常对齐,则无需进行下面的步骤,但如果出现下图情况并未正常对齐的,再进行 ...