题目链接: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. Red5源代码分析 - 关键类及其初始化过程

    原文地址:http://semi-sleep.javaeye.com/blog/348768 Red5如何响应rmpt的请求,中间涉及哪些关键类? 响应请求的流程如下: 1.Red5在启动时会调用RT ...

  2. HDU 1213 How Many Tables (并查集)

    How Many Tables 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/C Description Today is Ig ...

  3. jQuery基础学习8——层次选择器children()方法

    $('body > div').css("background","#bbffaa"); //和children()方法是等价的,父子关系,和parent ...

  4. javascript实现颜色渐变

    渐变(Gradient)是美学中一条重要的形式美法则,与其相对应的是突变.形状.大小.位置.方向.色彩等视觉因素都可以进行渐变.在色彩中,色相.明度.纯度也都可以产生渐变效果,并会表现出具有丰富层次的 ...

  5. python challenge第1关--NoteBook上的“乱码”

    在 python challenge第0关中已经得到第1关的地址了: http://www.pythonchallenge.com/pc/def/map.html 一.观察地址栏和标签: What a ...

  6. 终于吧Appserv搞通了

    .在学习php的时候遇到了这个问题; 1.Fatal error: Call to undefined function set_magic_quotes_runtime() in E:\App 打开 ...

  7. django控制admin的model显示列表

    class goods(models.Model):    name = models.CharField(max_length=300)    price = models.IntegerField ...

  8. DataGridView 添加ComboBox

    http://www.wapsolo.com/Personal/personal_view_75.aspx DataGridView 添加ComboBox 第一: 先在窗体设计时拖一个ComBoBox ...

  9. codeforces Gym 100500H A. Potion of Immortality 简单DP

    Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/a ...

  10. Codeforces Gym 100650B Countdown DFS

    Problem B: CountdownTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/conte ...