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天运用同一种方式的最小花费,然后因为数据 ...
随机推荐
- Arch Linux Installation Guide
Arch Linux Installation Guide timedatectl set-ntp true sed -i '/Score/{/China/!{n;s/^/#/}}' /etc ...
- Win7下的内置FTP组件的设置详解
在局域网中共享文件,FTP是比较方便的方案之一.Win7内部集成了FTP,只是设置起来颇费一番功夫.着文以记之. 一.安装FTP组件 由于Win7默认没有安装FTP组件.故FTP的设置第一步就是安装F ...
- <转>SQL语句执行顺序说明
原文地址:http://www.cnblogs.com/summer_adai/archive/2011/10/28/2227605.html SQL 不同于与其他编程语言的最明显特征是处理代码的顺序 ...
- Jenkins搭建
1.添加仓库: sudo wget -O /etc/yum.repos.d/jenkins.repo \ http://jenkins-ci.org/redhat/jenkins.repo sudo ...
- poj 3468【线段树】
题意:给定Q(1<=Q<=100000)个数A1,A2…AQ,以及可能多次进行的两个操作 1)对某个区间Ai……Aj的每个数都加n(n可变) 2)对某个区间Ai……Aj的数求和 分析: 树 ...
- Linux学习笔记(10)文本编辑器vim
vim是一个功能强大的全屏幕文本编辑器,是Linux/Unix最常用的文本编辑器,其作用是建立.编辑.显示文本文件.vim的特点是没有菜单,只有命令. vim主要有三种工作模式,分别为命令模式.插入模 ...
- 【java基础】选择排序and冒泡排序
前言 : 今天学习的是J2SE视频里的第五章,数组部分,它里面留了一个经典的作业,就是让我们去从1倒9按一定规格排序,这让我想起了学习vb的时候最最让我头疼的两种排序方法,选择排序法 和 冒泡排序法. ...
- sql2014 新建用户并登陆
EXEC master.dbo.sp_addlogin @loginame = N'testuser1', @passwd = '123456', @defdb = N'master', @defla ...
- DOM、Window对象操作
一.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 一.基本语法: 数据类型(字符串,小数,整数,布尔,时间) var, v ...
- Loadrunner中参数化实战(9)-Unique+Once
参数化数据30条: 脚本如下,演示登录,投资,退出操作是,打印手机号: 首先验证Vugen中迭代: Unique+Once 设置迭代4次Action 结果如下: