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天运用同一种方式的最小花费,然后因为数据 ...
随机推荐
- mxnet环境搭建随记
安装mxnet还是遇到不少麻烦事,现在简单记一下,挖个坑,后续详细补充,打算写一下我的mxnet探索之旅. 更新: 具体安装mxnet,cuda,opencv过程已经补坑——点击进入 不知道为什么,在 ...
- 一个通过网络转换Ico到Png图片的小小程序(Ico2Png)
做软件界面需要用到ico文件, 结果皮肤库不支持ico格式的图标, 所以就想到了把ico转换成png. 网上ico转png的软件貌似并不多, 反倒是png转ico很大一片~~~~~~~~~ 要转换ic ...
- DIV宽度自动缓慢变化
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- maven File encoding has not been set
原pom.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- js判断当前的访问是手机还是电脑
<script type="text/javascript"> //平台.设备和操作系统 var system ={ win : false, mac : false, ...
- jquery中ajax的简单使用
一.load() 这是最简单的一个函数,传入一个url他会异步加载该url的内容,然后将内容插入每一个选中的元素中,替换掉其中已经存在的内容. 所以最简单的用法是: $("#myDiv&qu ...
- 6个值得推荐的Android开源框架简介(转)
虽然我们在做app的时候并不一定用到框架,但是一些好框架的思想是非常有学习价值的 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo ...
- springMVC核心配置文件样例
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- sql篇 select from where group by having order by
以前,自己总是记不住如何用group by,如何用order by,什么时候用group by,什么时候用order by,什么时候两者一起用,怎么用,谁先谁后,现在,我们就一起来说一下Select ...
- 03_Java面向对象特征: 封装性
1. 面向对象的概念 面向对象是相对面向过程而言,面向对象和面向过程都是一种思想 面向过程• 强调的是功能行为面向对象• 将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象 ...