题意:

给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数.

思路:

首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位消除.

dp[ i ][ x ][ y ] 表示前 i 位已经消除为0, 且其后的两位为x,y时, 所需要的最小操作数.

每次可以旋转1~3位, 注意旋转3位时, 第三位和第二位的约束关系.[因此而wa了...]

和Wordstack那道题的"题解版"的思路相同, 用已知的状态去更新未知的状态.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int dp[MAXN][10][10], bit[MAXN], n;
char s[MAXN], t[MAXN];
int main()
{
while(~scanf("%s %s",s,t))
{
n = strlen(s);
for(int i=0;i<n;i++)
bit[i+1] = (t[i]+10-s[i]) % 10;
bit[n+1] = bit[n+2] = 0;
memset(dp,0x3f,sizeof(dp));
dp[0][bit[1]][bit[2]] = 0;
for(int i=0;i<n;i++)
for(int x=0;x<10;x++)
for(int y=0;y<10;y++)
if(dp[i][x][y]!=INF)
{
dp[i+1][y][bit[i+3]]
= min(dp[i+1][y][bit[i+3]],
dp[i][x][y] + min(x,10-x));//1
for(int j=1;j<=x;j++)
{
dp[i+1][(y+10-j)%10][bit[i+3]]
= min(dp[i+1][(y+10-j)%10][bit[i+3]],
dp[i][x][y] + x);//2
for(int k=1;k<=j;k++)
dp[i+1][(y+10-j)%10][(bit[i+3]+10-k)%10]
= min(dp[i+1][(y+10-j)%10]
[(bit[i+3]+10-k)%10],
dp[i][x][y] + x);
}
for(int j=1;j<=10-x;j++)
{
dp[i+1][(y+j)%10][bit[i+3]]
= min(dp[i+1][(y+j)%10][bit[i+3]],
dp[i][x][y] + 10-x);//2
for(int k=1;k<=j;k++)
dp[i+1][(y+j)%10][(bit[i+3]+k)%10]
= min(dp[i+1][(y+j)%10][(bit[i+3]+k)%10],
dp[i][x][y] + 10-x);
}
}
printf("%d\n",dp[n][0][0]);
}
}

话说...这是组队以来我做的第一道非水题.....对我而言的非水题吧......

DP还是比较有意思的, 要多多练习~ orz

[HDU 4433]locker[DP]的更多相关文章

  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 2012 Asia Tianjin Regional Contest 减少国家DP

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

  5. HDU 4433 locker

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

  6. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  7. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  8. hdu 3709 数字dp(小思)

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...

  9. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. 再探Linux动态链接 -- 关于动态库的基础知识

      在近一段时间里,由于多次参与相关专业软件Linux运行环境建设,深感有必要将这些知识理一理,供往后参考. 编译时和运行时 纵观程序编译整个过程,细分可分为编译(Compiling,指的是语言到平台 ...

  2. [转]十年前的老文:以 Linux 的名义

    一.灰姑娘的狂欢 今年初,林纳斯·托瓦兹承认:“如果在12年前,有人告诉我Linux会发展到今天的模样,我肯定会惊得目瞪口呆.” 托瓦兹说的是实话.1991年,这名21岁的芬兰赫尔辛基大学的学生,偶然 ...

  3. Windows Forms(二)

    导读 1.用VS创建一个Windows Forms程序 2.分析上面的程序 3.Mediator pattern(中介者模式) 4.卡UI怎么办——BackgroundWorker组件 用VS创建一个 ...

  4. sublime 安装 Terminal 使用 cmder

    在 packagecontrol.io 可以找到 Terminal. 在 cmder.net 下载 cmder 复制 Terminal.sublime-settings 文件到 C:\Users\WX ...

  5. QT Slot/Signal

    QT的Slot/Singal-槽/信号 1.Usage/使用方法 所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含 信号/signal和 槽/slot.当对象改变其状态 ...

  6. away3d打包到IOS锯齿问题解决办法

    很多ios设备是高清屏,一个像素顶普通设备四个像素.从这点上也许可以入手解决. 先把<requestedDisplayResolution>high</requestedDispla ...

  7. preg_match_all, preg_match

    int preg_match(string $pattern, string $subject[, $arr][, int $flags]);$pattern 正则表达式$subject: 要搜索的字 ...

  8. 一台Ubuntu server上安装多实例MySQL

    受环境所迫,在一台Ubuntu server上安装多个实例MySQL. 手动安装MySQL 环境:Ubuntu server 11.10 64bit + mysql-5.5.17-linux2.6-x ...

  9. inline-block的兼容性问题

    inline-block的兼容性问题 Inline-block是元素display属性的一个值.这个名字的由来是因为,display设置这个值的元素,兼具行内元素( inline elements)跟 ...

  10. mysql更改默认存储引擎

    在mysql的官网上看到在mysql5.5以上的版本中已经更改了默认的存储引擎,在5.5版本以前是Myisam以后是Innodb. InnoDB as the Default MySQL Storag ...