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天运用同一种方式的最小花费,然后因为数据 ...
随机推荐
- Delphi如何处理不同类型的文件
参考:http://www.cnblogs.com/railgunman/articles/1800318.html 程序设计当中,我们时常遇到需要处理文件.目录及驱动器的情况,这里将对如何处理不同类 ...
- Delphi基础语法的学习笔记和注意事项总结
以下是我在自学Delphi的时候,对一些注意点的简单总结,并没有什么系统性可言,只是一个学习时顺手记下的笔记,主要为了当时加深对知识的印象,并没有希望能在以后的复习和使用Delphi中有什么多大的参考 ...
- Analysis Services OLAP 概述2
在DW/BI系统中,关系型数据库是存储和管理数据的最佳场所.但是关系数据库本身的智能化程度不够.关系型数据库缺乏如下功能: 丰富的元数据,帮助用户浏览数据和创建查询. 强大的分析计算和函数,在对上下文 ...
- T-SQL 常用语句
1. 查看 Table 或者 Column 被那些object(存储过程.函数或View)调用. select a.* from sysobjects a, syscomments b where a ...
- 严重: End event threw exception java.lang.IllegalArgumentException: Can't convert argument: null
堆栈信息: 2014-6-17 10:33:58 org.apache.tomcat.util.digester.Digester endElement 严重: End event threw exc ...
- [Tools] Eclipse使用小技巧-持续更新
[背景] 使用之中发现一些eclipse使用的小技巧,记录下来供以后查阅 Eclipse保存preferences,并导入到其他workspaces The Export wizard can b ...
- KMP模式匹配算法
KMP模式匹配算法 相信很多人对于这个还有点不了解,或者说是不懂,下面,通过一道题,来解决软考中的这个问题! 正题: aaabaaa,其next函数值为多少? 对于这个问题,我们应该怎么做呢? 1.整 ...
- SQLServer两张表筛选相同数据和不同数据
概述 项目中经常会对两张数据库表的数据进行比较,选出相同的数据或者不同的数据.在SQL SERVER 2000中只能用Exists来判断,到了SQL SERVER 2005以后可以采用EXCEPT和I ...
- LoadRunner 接口测试
Action1() { int i; lr_rendezvous("rend"); lr_start_transaction("get"); ;i<;i+ ...
- DSP using MATLAB 示例Example3.1 3.2 3.3
上代码: w = [0:1:500]*pi/500; % [0,pi] axis divided into 501 points. X = exp(j*w) ./ (exp(j*w) - 0.5*on ...