意甲冠军:给定的长度可达1000数的顺序,图像password像锁。可以上下滑动,同时会0-9周期。

每个操作。最多三个数字连续操作。现在给出的起始序列和靶序列,获得操作的最小数量,从起始序列与靶序列。

花了一天的时间。我觉得是道非常难的DP。这个阶段非常好划分,对于前面完毕的password锁就不再考虑。问题的关键是这个旋转每次能够的情况非常多。

同一时候也能够发现当I位置上确定移好后,至多影响到后两位。-> dp[i][j][k] 表示当前i位移好后,i+1 为j ,  i+2为k 的次数。

这里同一时候使用一个预处理技巧,对于一个移动操作。有向上向下两种。

当将一个值转到还有一个值,up[i][j]=(j-i+10)%10;down[i][j]=(i-j+10)%10;  i->j 的方法

在dp中必定会有对于阶段的描写叙述,一般从1開始,表达每一段。这里为了求dp[n][0][0] 在最后再补上两位。

dp[0][s[0]][s[1]]=0;

刚開始0阶段,一个都未完毕的时候。即前0次移好i+1,i+2位为这种次数为0

int r=up[j][t[i-1]];//①
dp[i][(k+u)%10][(s[i+1]+v)%10]=min(...)//②

这两句话是我刚開始一直困惑的地方。

首先要明白转移方程是阶段间的转移dp[i-1][...][...]->dp[i][...][...]

这样看,配合②我们发现当dp[i-1][j][k]已知,dp[i][...][...]是将其  j转为t[i-1]。(这个是理解的关键)。这里的u,v表明的是在j转为t[i-1]过程中。后两位的改变情况枚举值。

dp[i][(k+u)%10][(s[i+1]+v)%10] 这个如今就能够理解了,对于dp[i-1]的j 如今dp[i]考虑的就是上次的K了。

另一点就是标号非常乱一会是阶段的i。一会又是起始位置.......

#include <stdio.h>
#include <string.h>
#include <map>
#include <iostream>
#define inf 0x3fffffff
const int maxn=1010;
typedef unsigned __int64 ull;
using namespace std;
char s[maxn],t[maxn];
int dp[maxn][10][10];
int up[10][10],down[10][10];
int min(int a,int b)
{
return a<b?a:b;
}
void init()
{
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
up[i][j]=(j-i+10)%10;
down[i][j]=(i-j+10)%10;
}
} int main()
{
init();
while(~scanf("%s%s",s,t))
{
memset(dp,0x3f,sizeof(dp));
int i,j,k,u,v;
int n=strlen(s);
s[n]=s[n+1]=t[n]=t[n+1]=0;
for(i=0;i<n;i++)
s[i]-='0',t[i]-='0';
dp[0][s[0]][s[1]]=0;//除了最初的序列。其它的dp都没有合法值
for(i=1;i<=n;i++)
{
for(j=0;j<10;j++)//枚举两位数字的每一位
{
for(k=0;k<10;k++)
{
int r=up[j][t[i-1]];//从j转到t[i-1]的次数,将三位中最左边的数字向上转到目标序列须要的操作
for(u=0;u<=r;u++)//枚举可能出现的操作
{
for(v=0;v<=u;v++)
dp[i][(k+u)%10][(s[i+1]+v)%10]=min(dp[i][(k + u) % 10][(s[i+1] + v) % 10], dp[i-1][j][k] + r);
}
r=down[j][t[i-1]];
for(u=0;u<=r;u++)
for(v=0;v<=u;v++)
dp[i][(k-u+10)%10][(s[i+1]-v+10)%10]=min(dp[i][(k - u+10) % 10][(s[i+1] - v +10) % 10], dp[i-1][j][k] + r);
}
}
}
printf("%d\n",dp[n][0][0]);
} return 0;
}

HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP的更多相关文章

  1. HDU-4432-Sum of divisors ( 2012 Asia Tianjin Regional Contest )

    Sum of divisors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. 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 ...

  3. HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)

    Problem Description In this problem, you are given several strings that contain only digits from '0' ...

  4. HDU 4441 Queue Sequence(优先队列+Treap树)(2012 Asia Tianjin Regional Contest)

    Problem Description There's a queue obeying the first in first out rule. Each time you can either pu ...

  5. HDU 4431 Mahjong(枚举+模拟)(2012 Asia Tianjin Regional Contest)

    Problem Description Japanese Mahjong is a four-player game. The game needs four people to sit around ...

  6. hdu 3123 GCC (2009 Asia Wuhan Regional Contest Online)

    GCC Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Subm ...

  7. HDU 3721 Building Roads (2010 Asia Tianjin Regional Contest) - from lanshui_Yang

    感慨一下,区域赛的题目果然很费脑啊!!不过确实是一道不可多得的好题目!! 题目大意:给你一棵有n个节点的树,让你移动树中一条边的位置,即将这条边连接到任意两个顶点(边的大小不变),要求使得到的新树的直 ...

  8. HDU 3726 Graph and Queries(平衡二叉树)(2010 Asia Tianjin Regional Contest)

    Description You are given an undirected graph with N vertexes and M edges. Every vertex in this grap ...

  9. HDU 4468 Spy(KMP+贪心)(2012 Asia Chengdu Regional Contest)

    Description “Be subtle! Be subtle! And use your spies for every kind of business. ”― Sun Tzu“A spy w ...

随机推荐

  1. Wamp环境下配置--Apache虚拟主机

    1.首先打开apache的配置文件httpd.conf,并去掉#Include conf/extra/httpd-vhosts.conf前面的#,启用虚拟主机功能 # Virtual hosts In ...

  2. UltraEdit破解方法最强收录

    作为一个能够满足你一切编辑需求的强大文本编辑器.ultraedit在IT届有着非常高的人气.只是它正版的价钱也是不廉价滴,没记错的话是要好几十刀. 那么对于我们来说,破解UltraEdit就是一项必备 ...

  3. ORACLE中%TYPE和%ROWTYPE的使用

     1 %TYPE说明 为了使一个变量的数据类型与还有一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了%TYPE定义方式.当被參照的那个变量的数据类型改变了之后,这个新定 ...

  4. MD5 概念与用途

    MD5概念: MD5这是message-digest algorithm 5(信息-摘要算法)缩写.用于加密和解密技术上,它能够说是文件的"数字指纹".不论什么一个文件,不管是可运 ...

  5. SQL简单的日报和月报

    --320, SQL SERVER 日报 --查询2009-01-01当天客户A1,A2,A3的订单数量 SELECT Cust_Name , CONVERT(CHAR(10), Order_Date ...

  6. jersey client上传下载文件

    jersey client上传文件demo File file = new File("/tmp/test.jpg"); System.out.println(file.exist ...

  7. 腾讯视频QLV格式转换mp4的方法

    腾讯视频QLV格式转换mp4的方法不知道大家知不知道用?喜欢用腾讯视频的朋友应该都知道腾讯视频单独搞出了个QLV格式文件,只能用腾讯独有的腾讯视频软件才能播放,就算用格式工厂转换也不行,那么腾讯视频的 ...

  8. 全面剖析Redis Cluster原理和应用 (转)

    1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生 ...

  9. c++对象指针-01(转载)

    1.指向对像的指针在建立对像时,编译系统会为每一个对像分配一定的存储空间,以存放其成员,对像空间的起始地址就是对像的指针.可以定义一个指针变量,用来存和对像的指针.如果有一个类:class Time{ ...

  10. Difference between datacontract and messagecontract in wcf

    在WCF中有两种契约各自是DataContract和MessageContract,这篇博客来讲一下两者的差别.先看一下两者定义契约实体的方式有和不同. 1.数据契约 <span style=& ...