[HDU 4433]locker[DP]
题意:
给出密码做的现状和密码, 每次可以移动连续的最多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]的更多相关文章
- 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就不敢敲了呢 ...
- 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 ...
- HDU 4433 locker(SPFA+DP)
题目链接 去年区域赛的题目,早就看过题目了,又是过了好久了... 这题状态转移,一看就知道应该是 线性的那种,不过细节真的不好处理,一直没想出怎么搞,期间也看过题解,好像没太看懂... dp[i][j ...
- HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP
意甲冠军:给定的长度可达1000数的顺序,图像password像锁.可以上下滑动,同时会0-9周期. 每个操作.最多三个数字连续操作.现在给出的起始序列和靶序列,获得操作的最小数量,从起始序列与靶序列 ...
- HDU 4433 locker
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4433 这是一道2012年ACM天津赛区现场赛的题目,大意是给出两串数字,求用最少的转换次数将一串(A) ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 3709 数字dp(小思)
http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- HW--自守数
package testcase; import huawei.Demo; import junit.framework.TestCase;//加入测试框架,不需要写Main函数 public cla ...
- Html5 js FileReader接口
用来把文件读入内存,并且读取文件中的数据.FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据.到目前文职,只有FF3.6+和Chrome6 ...
- java继承实例。
定义了一个点类point,然后线条类line继承了point类,正方形类Suare继承point类. package test; import javax.swing.*; public class ...
- Linux启动提示“unexpected inconsistency;RUN fsck MANUALLY”
问题:在开机启动时,提示“unexpected inconsistency;RUN fsck MANUALLY”进不了系统 解决方法: fsck不仅可以对文件系统进行扫描,还能修正文件系统的一些问题, ...
- OpenJudge/Poj 1936 All in All
1.链接地址: http://poj.org/problem?id=1936 http://bailian.openjudge.cn/practice/1936 2.题目: All in All Ti ...
- csdn博客刷点击率代码
此文为转载,亲测有效. import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; impo ...
- gulp-less学习教程
过程安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务node.npm安装 自己搜全局安装gul ...
- discuz 重新定义jquery的$
最近做个小插件 发现加了这个代码不执行: $.ajax({ url:'plugin.php?id=register:regeist_jiangsu', type:'post', data:{ 'mob ...
- (转载)Delphi开发经验谈
Delphi开发经验谈 开发环境-------- Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件. ...
- poj 3250 Bad Hair Day 单调栈入门
Bad Hair Day 题意:给n(n <= 800,000)头牛,每头牛都有一个高度h,每头牛都只能看到右边比它矮的牛的头发,将每头牛看到的牛的头发加起来为多少? 思路:每头要进栈的牛,将栈 ...