HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP
意甲冠军:给定的长度可达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的更多相关文章
- 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) ...
- 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 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)
Problem Description In this problem, you are given several strings that contain only digits from '0' ...
- 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 ...
- 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 ...
- 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 ...
- HDU 3721 Building Roads (2010 Asia Tianjin Regional Contest) - from lanshui_Yang
感慨一下,区域赛的题目果然很费脑啊!!不过确实是一道不可多得的好题目!! 题目大意:给你一棵有n个节点的树,让你移动树中一条边的位置,即将这条边连接到任意两个顶点(边的大小不变),要求使得到的新树的直 ...
- 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 ...
- 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 ...
随机推荐
- Wamp环境下配置--Apache虚拟主机
1.首先打开apache的配置文件httpd.conf,并去掉#Include conf/extra/httpd-vhosts.conf前面的#,启用虚拟主机功能 # Virtual hosts In ...
- UltraEdit破解方法最强收录
作为一个能够满足你一切编辑需求的强大文本编辑器.ultraedit在IT届有着非常高的人气.只是它正版的价钱也是不廉价滴,没记错的话是要好几十刀. 那么对于我们来说,破解UltraEdit就是一项必备 ...
- ORACLE中%TYPE和%ROWTYPE的使用
1 %TYPE说明 为了使一个变量的数据类型与还有一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了%TYPE定义方式.当被參照的那个变量的数据类型改变了之后,这个新定 ...
- MD5 概念与用途
MD5概念: MD5这是message-digest algorithm 5(信息-摘要算法)缩写.用于加密和解密技术上,它能够说是文件的"数字指纹".不论什么一个文件,不管是可运 ...
- SQL简单的日报和月报
--320, SQL SERVER 日报 --查询2009-01-01当天客户A1,A2,A3的订单数量 SELECT Cust_Name , CONVERT(CHAR(10), Order_Date ...
- jersey client上传下载文件
jersey client上传文件demo File file = new File("/tmp/test.jpg"); System.out.println(file.exist ...
- 腾讯视频QLV格式转换mp4的方法
腾讯视频QLV格式转换mp4的方法不知道大家知不知道用?喜欢用腾讯视频的朋友应该都知道腾讯视频单独搞出了个QLV格式文件,只能用腾讯独有的腾讯视频软件才能播放,就算用格式工厂转换也不行,那么腾讯视频的 ...
- 全面剖析Redis Cluster原理和应用 (转)
1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生 ...
- c++对象指针-01(转载)
1.指向对像的指针在建立对像时,编译系统会为每一个对像分配一定的存储空间,以存放其成员,对像空间的起始地址就是对像的指针.可以定义一个指针变量,用来存和对像的指针.如果有一个类:class Time{ ...
- Difference between datacontract and messagecontract in wcf
在WCF中有两种契约各自是DataContract和MessageContract,这篇博客来讲一下两者的差别.先看一下两者定义契约实体的方式有和不同. 1.数据契约 <span style=& ...