HDU 4433 locker(SPFA+DP)
去年区域赛的题目,早就看过题目了,又是过了好久了。。。
这题状态转移,一看就知道应该是 线性的那种,不过细节真的不好处理,一直没想出怎么搞,期间也看过题解,好像没太看懂。。。
dp[i][j]表示前i位相同,i之后两位为j的最小转动次数。
例如dp[i][x*10+y] i+3位 为z(初始数字),x y z 转化为 ax ay az,ax肯定是第二个串的第i位,后两位随便就可以。
只要 预处理 xyz 转化为axayaz的情况,就行了。dp[0]初始化,100位直接Floyd,其他的1000位的预处理,用spfa搞的。
预处理写的很长。。
#include <cstring>
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define INF 10000000
char s1[],s2[];
int dp[][];
int mp[][];
int dis[];
int in[];
int p[][];
int n1[],n2[];
int a[] = {,,,,,,-,,,-,,-};
int b[] = {,,,,,,,-,,-,-,-};
int c[] = {,,,,,,,,-,,-,-};
void spfa(int key)
{
int x,y,z,i,ax,ay,az,u,v;
queue <int> que;
for(i = ;i < ;i ++)
{
dis[i] = INF;
in[i] = ;
}
in[key] = ;
dis[key] = ;
que.push(key);
while(!que.empty())
{
u = que.front();
in[u] = ;
que.pop();
x = (u/)%;
y = (u/)%;
z = u%;
for(i = ;i < ;i ++)
{
ax = (x+a[i]+)%;
ay = (y+b[i]+)%;
az = (z+c[i]+)%;
v = ax*+ay*+az;
if(dis[v] > dis[u] + )
{
if(!in[v])
{
in[v] = ;
que.push(v);
}
dis[v] = dis[u] + ;
}
}
}
for(i = ;i < ;i ++)
mp[key][i] = dis[i];
return ;
}
int main()
{
int i,j,len,x,y,z,k,temp;
for(i = ;i < ;i ++)
{
for(j = ;j < ;j ++)
p[i][j] = INF;
p[i][i] = ;
}
for(i = ;i < ;i ++)
{
x = (i/)%;
y = i%;
p[x][(y+)%] = ;
p[(y+)%][x] = ;
p[(x+)%][y] = ;
p[y][(x+)%] = ;
p[(x+)%][(y+)%] = ;
p[(y+)%][(x+)%] = ;
}
for(i = ;i < ;i ++)
{
for(j = ;j < ;j ++)
{
for(k = ;k < ;k ++)
{
if(p[j][k] > p[j][i] + p[i][k])
p[j][k] = p[j][i] + p[i][k];
}
}
}
for(i = ;i < ;i ++)
{
spfa(i);
}
while(scanf("%s%s",s1,s2)!=EOF)
{
len = strlen(s1);
for(i = ;i <= len;i ++)
{
n1[i] = s1[i-] - '';
n2[i] = s2[i-] - '';
}
for(i = ;i <= len;i ++)
{
for(j = ;j < ;j ++)
dp[i][j] = INF;
}
n1[len+] = n2[len+] = ;
n1[len+] = n2[len+] = ;
temp = n1[] * + n1[];
for(i = ;i < ;i ++)
{
dp[][i] = p[temp][i];
}
for(i = ;i < len;i ++)
{
z = n1[i+];
for(j = ;j < ;j ++)
{
x = (j/)%;
y = j%;
for(k = ;k < ;k ++)
{
if(dp[i+][k] > dp[i][j] + mp[j*+z][n2[i+]*+k])
dp[i+][k] = dp[i][j] + mp[j*+z][n2[i+]*+k];
}
}
}
printf("%d\n",dp[len][]);
}
return ;
}
HDU 4433 locker(SPFA+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 3499 Flight spfa+dp
Flight Time Limit : 20000/10000ms (Java/Other) Memory Limit : 65535/65535K (Java/Other) Total Subm ...
- 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]
题意: 给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数. 思路: 首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位 ...
- 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) ...
- 【BZOJ1003】1003: [ZJOI2006]物流运输trans SPFA+DP
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- BZOJ 1003 [ZJOI2006]物流运输trans SPFA+DP
题意:链接 方法:SPFA+DP 解析:挺好的题目.因为数据范围较小所以用这样的方式能够搞,只是也是挺不好想的. 我们定义cost(i,j)表示从第i天走到第j天运用同一种方式的最小花费,然后因为数据 ...
随机推荐
- 算法系列:XXX
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- 7-14 EXISTS子查询
EXISTS: 只注重于子查询是否有返回行,如果查有返回行返回结果为值,否则为假 并不使用子查询的结果,仅用于测试子查询是否有返回结果. 语法: IF EXISTS (子查询) BEGIN 语句块 E ...
- android 面试题
一,什么是OOM (1)先从定义开始:Android(Java)中常见的容易引起内存泄漏的不良代码Android主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置 ...
- ThinkPHP中使用ajaxReturn进行ajax交互
以管理员登录为例来介绍下$this->ajaxReturn与模板页进行ajax交互使用方法 首先看PHP控制器的处理,在application/Admin/Controller/LoginCon ...
- hdu 4026 2011上海赛区网络赛F TSP ****
没看过TSP,先mark //4838039 2011-10-27 23:04:15 Accepted 4026 2343MS 31044K 3143 B C++ Geners //状态压缩DP的TS ...
- [Liferay6.2]核心配置文件portal.properties
portal.properties是liferay中一个非常核心的配置文件.我们可以在liferay源代码或者解压liferay部署包中的portal-impl.jar中获得.以liferay6.2为 ...
- 汇编学习(五)——表处理程序
(一)串操作指令及重复前缀 一.串操作指令: 1.串传送指令: (1)指令格式: MOVS dst,rsc MOVSB ;ES:[DI]<--DS:[SI],SI<-SI+/-,DI< ...
- 用Access作为后台数据库支撑。
/// <summary> /// 读取Excel文档 /// </summary> /// <param name="Path">文件名称&l ...
- yaml官方介绍
官方网站 http://yaml.org/ 数据结构类型说明 http://yaml.org/type/ YAML Specification http://yaml.org/spec/
- Understanding, Operating and Monitoring Apache Kafka
Apache Kafka is an attractive service because it's conceptually simple and powerful. It's easy to un ...