Locker
题意:
有2个数字串,每次可以变化1-3位(每位+1或-1(0-9,9-0)可循环),求由1串变到2串的最小用的次数。
分析:
dp[i][num]表示变到第i位时最后两位组成的数是num时最小次数(因为dp[i-1][num1],num1肯定是i位数的i-1,i-2位数,dp[i][num]=min(dp[i-1][num1]+cost[p][q])cost[p][q]表示(p,q后三位数字最小转化次数,可以预处理,要细心)
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod = ;
int dp[][],cost[][],n;
char a[],b[];
void init(){
for(int i=;i<;++i)
for(int j=;j<;++j){
if(i==j)continue;
if(cost[i][j]!=)continue;
int p1=i/;
int p2=(i/)%;
int p3=i%;
int q1=j/;
int q2=(j/)%;
int q3=j%;
int u1,u2,u3;
if(p1<q1){
u1=q1-p1;
p2=(p2+u1)%;
p3=(p3+u1)%;
}
else{
u1=p1-q1;
p2=(p2-u1+)%;
p3=(p3-u1+)%;
}
if(p2<q2){
u2=q2-p2;
p3=(p3+u2)%;
}
else{
u2=p2-q2;
p3=(p3-u2+)%;
}
u3=p3>q3?p3-q3:q3-p3;
u1=u1>-u1?-u1:u1;
u2=u2>-u2?-u2:u2;
u3=u3>-u3?-u3:u3;
cost[i][j]=cost[j][i]=u1+u2+u3;
}
}
void solve(){
for(int i=;i<;++i){
int id=a[]-'';
int tmp=i>id?i-id:id-i;
dp[][i]=(tmp>-tmp)?-tmp:tmp;
}
for(int i=;i<;++i){
int minv=INF;
for(int j=;j<;++j){
int q=a[]-''+j*;
minv=min(minv,dp[][j]+cost[i][q]);
}
dp[][i]=minv;
}
int now=;
for(int i=;i<=n;++i){
now^=;
for(int j=;j<;++j)
{
int minv=INF;
for(int k=;k<;++k){
int p=(b[i-]-'')*+j;
int q=*k+(a[i]-'');
minv=min(minv,dp[now^][k]+cost[p][q]);
}
dp[now][j]=minv;
}
}
int num=*(b[n-]-'')+(b[n]-'');
printf("%d\n",dp[now][num]);
}
int main()
{
init();
while(scanf("%s%s",a+,b+)==){
n=strlen(a+);
if(n==)
{
int m=a[]>b[]?a[]-b[]:b[]-a[];
printf("%d\n",m>-m?-m:m);
}
else{
solve();
}
}
return ;
}
Locker的更多相关文章
- 2018 - 2019 CTU Open Contest E. Locker Room 【后缀数组】
任意门:http://codeforces.com/gym/101954/problem/E E. Locker Room time limit per test 2.0 s memory limit ...
- 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(12年天津,DP)
4576 njczy2010 C Accepted 860 KB 140 ms G++ 2063 B 2014-10-16 09:51:19 哎,为啥1000*100*100的复杂度的dp就不敢敲了呢 ...
- SPOJ - LOCKER
SPOJ - LOCKERhttps://vjudge.net/problem/45908/origin暴力枚举2-102 23 34 2 25 2 36 3 37 2 2 38 2 3 39 3 3 ...
- HDU 4433 locker(SPFA+DP)
题目链接 去年区域赛的题目,早就看过题目了,又是过了好久了... 这题状态转移,一看就知道应该是 线性的那种,不过细节真的不好处理,一直没想出怎么搞,期间也看过题解,好像没太看懂... dp[i][j ...
- HDU 4433 locker
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4433 这是一道2012年ACM天津赛区现场赛的题目,大意是给出两串数字,求用最少的转换次数将一串(A) ...
- [HDU 4433]locker[DP]
题意: 给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数. 思路: 首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位 ...
- hdu4433 locker
暴力dp.. dp[i][j][k] 表示 前i位完全匹配 j 表示i+1位 k表示i+2位 枚举j k #include<iostream> #include<cstdio> ...
- dp hdu-4433 locker
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4433 题目大意: 给两个长度相等的数字串s1,s2.每次操作可以把连续的最多三位都+1或-1,如果超 ...
随机推荐
- My SQL InnoDB 1217 - Cannot delete or update a parent row:aforeign key constraint fals
InnoDB 允许有外键 MyISAM 不允许有外键 InnoDB修改成MyISAM 证明有外键 一张表如果有其他表的外键关联的是它 它也不能是MyISAM 来自为知笔记(Wiz)
- 在AE中通过SDE添加图层(转)
public void AddSDELayer(bool ChkSdeLinkModle) { //< span style="color: #00 ...
- 【推荐】《Netty in action》书籍
最近准备开始阅读一下<Netty in action>并且准备构架设计一个分布式系统.用于新项目. 貌似压力很大啊.压力就是东西.希望自己能够调节好. Netty in action是Ne ...
- SparkContext和RDD
SparkContext.scala实现了一个SparkContext的class和object,SparkContext类似Spark的入口,负责连接Spark集群,创建RDD,累积量和广播量等. ...
- 测试用例生成工具ALLPAIRS(转)
ALLPAIRS是一个测试用例设计工具,用于Windows,但移植到了多种平台,以适应该脚本文件的一些小改动.它自动对所有实验技术进行设计,通过这个工具的方法可以在海量的数据组合中选择少量的数据生成测 ...
- JQuery Selectors 方法说明
基本选择器 $("#myDiv") 匹配唯一的具有此id值的元素 $("div") 匹配指定名称的所有元素 $(".myClass") 匹配 ...
- YTU 2621: B 继承 圆到圆柱体
2621: B 继承 圆到圆柱体 时间限制: 1 Sec 内存限制: 128 MB 提交: 313 解决: 240 题目描述 定义了Circle圆形类,在此基础上派生出Cylinder圆柱体类. ...
- YTU 2616: A代码完善--简易二元运算
2616: A代码完善--简易二元运算 时间限制: 1 Sec 内存限制: 128 MB 提交: 280 解决: 187 题目描述 注:本题只需要提交填写部分的代码,请按照C++方式提交. 编写二 ...
- 堆的 两种实现 (数组和STL)
基本思想: 两种操作都跟树的深度成正比,所以复杂度 O(log(n)) ; push():在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提直到没有大小颠倒为止. pop(): 从堆中取出 ...
- [51NOD1127]最短的包含字符串(尺取法)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1127 思路:尺取法,一开始我考虑更新右指针,直到遇到一个和l指 ...