作为一名屌丝程序员,机械键盘是哈利梦寐以求的神器。终于,在除夕夜的时候,他爸爸送了他一个机械键盘。
  哈利的键盘与我们平常所见到的的键盘不一样,我们可以认为他的键盘是一个500*500的矩形,其中26个字母键分布在某些格点上。这天,心血来潮的哈利想用他心爱的键盘写一些代码,假设他的代码只有一行,而且都是由小写的英文字母构成。由于键盘上的按键分布在不同的地方,哈利码代码时,移动手指要花费一些能量,其花费能量为上一次敲击的键,与当前要敲的键的曼哈顿距离。为了节省力气,哈利可以不必完全按照要敲的代码输入,他可以跳着输,比如helloworld,他可以按照d r o o l l l e h w的顺序输入,但是为了让输入的代码是他想要的输入顺序,在输入的过程中,他可能需要移动光标,在相应的位置输入对应的单词,作为一名熟练的vim选手,哈利将光标移动一个位置仅需1的费用,比如他想输入qpy,他按q->y->p的顺序输入,那么花费的总的能量为cost(q,y)+1+cost(y,p),其中cost(x,y)为字母x,y之间的曼哈顿距离,当中花费的1的能量为输入y后,往左移动一次光标所花费的能量。当然,人的记忆力都是有限的,哈利最多只能记住连续10个位置的字母有没有输入过,也就是说如果想输入第i个字符,要么i<=10或者所有第i-10(包含)以前的字符都已经输入,比如第1个位置的字母还没有输,他就不能考虑第11个字母,因为一旦考虑第11个字母的时候,他就忘了第1个字母有没有输了。现在哈利想知道,他敲完这篇代码,最少需要多少能量?哈利第一次输入的时候可以不花费能量。

 Input
  前26行,每行两个整数x, y (0<=x<500, 0<=y<500)以空格分开,表示26个英文字母键a-z所在位置,保证不会有两个键在相同的位置
  第27行为一个长度不超过100的字符串(非空),表示哈利要敲的代码,由小写字母a-z组成
 Output
  输出一个整数,表示哈利敲完代码最少花多少能量

  状压DP。f[i][j][zt]表示考虑了前i位(i-10以前的都填完了),在最后10位里的第j位,最后10位里是否填了数的状态为zt。

  转移的话,一种是从j挪到最后10位里的另外一个未填的位,另一种是从j挪到第i+x位,要求x<=10且i-10..i-10+x都填了。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define ui unsigned int
#define ull unsigned long long
const int maxn=,inf=;
int f[][][];
int dis[][][],map[][],x[],y[];
int i,j,k,n,m;
char s[],s1[]; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
} inline void mins(int &a,int b){if(b<a)a=b;}
inline int run(int n){
int i,j,_j,zt;register int j1,_j1,zt1;int mx=<<,nowf;
// for(i=1;i<=n;i++)printf("%c",s[i]+'a'-1);puts("");
for(i=;i<=n;i++)memset(f[i],,sizeof(f[i]));
for(i=;i<;i++)f[][i][<<i]=; for(i=;i<=n;i++)for(zt=;zt<mx;zt++)for(j=,_j=i-+j;j<;j++,_j++)if(zt&(<<j)){
nowf=f[i][j][zt];
for(j1=,_j1=i-+j1;j1<;j1++,_j1++)if(!(zt&(<<j1)))
mins(f[i][j1][zt|(<<j1)],nowf+map[s[_j]][s[_j1]]+dis[zt][j][j1]);
for(j1=,_j1=i++j1,zt1=zt>>;j1<&&(zt&(<<j1))&&_j1<=n;j1++,_j1++,zt1>>=)
mins(f[_j1][][zt1|(<<)],nowf+map[s[_j]][s[_j1]]+dis[zt][j][]);
}
int ans=<<;
for(i=;i<;i++)mins(ans,f[n][i][mx-]);
// printf(" %d\n",ans);
return ans;
}
inline int abs(int x){return x<?-x:x;}
int main(){
int mx=<<;
for(i=;i<mx;i++)for(j=;j<;j++)if(i&(<<j))for(k=;k<;k++)if(!(i&(<<k))){
int a=j,b=k;if(a>b)std::swap(a,b);
for(int i1=a+;i1<b;i1++)if(i&(<<i1))dis[i][j][k]++;
dis[i][j][k]+=k<j;
} for(i=;i<=;i++){
x[i]=read(),y[i]=read();
for(j=;j<=i;j++)map[i][j]=map[j][i]=abs(x[i]-x[j])+abs(y[i]-y[j]);
}
scanf("%s",s+),n=strlen(s+);
for(i=;i<=n;i++)s[i]-='a'-; if(n>=)return printf("%d\n",run(n)),;
for(i=;i<=n;i++)s1[i+-n]=s[i];
int ans=<<;
for(i=;i<=;i++){
for(j=;j<=-n;j++)s1[j]=i;
memcpy(s,s1,sizeof(s1));
mins(ans,run());
}
printf("%d\n",ans);
}

[51nod1373]哈利与他的机械键盘的更多相关文章

  1. Tickeys -- 找对打字的感觉 (机械键盘音效软件)

    最近发现公司里面越来越多人开始用机械键盘了,问了很多人为什么用机械键盘,主要有两种,一种是真的情怀,他们怀念十年前那种台式机硬邦邦的键盘,另外一种是因为喜欢机械键盘的声音,打字很爽.前者那真是没救了, ...

  2. 技术分享:逆向海盗船k95机械键盘

    引文 在几年前我买了一个海盗船 K95 Vengeance机械键盘,键盘有上有背光功能,于是我在考虑是不是可以修改一下.但作者表示购买来的键盘上面没有很多的资料可供利用,需要注意的是,新版的K95与旧 ...

  3. apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard

    apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard 想在苹果电脑 mac 系统下使用 机械键盘,大部分机械键盘不是为mac设计的,所 ...

  4. mac下的改装人生——关于机械键盘

    这几天好像弄了很多关于机械键盘的东西,我自己的这块键盘也已经慢慢熟悉了,感觉打字超级爽哈,然后看了很多网上关于机械键盘的帖子,也看了很多教程,在Amazon和Taobao看了很多键盘的价位,前几天还试 ...

  5. 第一把机械键盘 ikbc C-87

    终于入了机械键盘,ikbc C-87黑色红轴. 原本上周五晚上就到了,但是那个键盘有几个键弹起后弹簧会持续响,敲了一会,实在不能忍受,就申请换货了.新换的键盘今天终于到了,没有了之前的问题,但是几乎每 ...

  6. mac 10.12 sierra 机械键盘+ratm可编程鼠标记录

      系统:mac 10.12 sierra 键盘:机械键盘 鼠标:mad catz ratm 在mac 10.11/10.12 之前: 机械键盘:一般的机械键盘在mac上使用, alt 和 win 键 ...

  7. 普通键盘Windows上虚拟Cherry机械键盘效果的方法

    草台班子--普通键盘Windows上虚拟Cherry机械键盘效果的方法    ​ 机械键盘以其独特的手感.绚丽的外形,还有那人神共愤的音效吸引着大批爱好者.最近iQQO 3的机械键盘效果更是吸引了更多 ...

  8. 从零DIY机械键盘/主控方案

    自从有了第一套机械键盘,先后修改了接口方案,安装了LED灯等,但是始终无法满足自己的DIY欲望. 于是想到最简单的方法就是用现成的主控,而主控来源于废弃的键盘,如下图: 这种主控也是矩阵方式,只需要测 ...

  9. 惠普机械键盘 K10GL 使用评测

    惠普机械键盘 GK100 使用评测 手感太差,不是 RGB 背光 惠普(HP) K10GL 机械键盘 有线 LED背光机械键盘 87键 混光青轴 refs https://item.jd.com/10 ...

随机推荐

  1. go实例之线程池

    go语言使用goroutines和channel实现一个工作池相当简单.使用goroutines开指定书目线程,通道分别传递任务和任务结果.简单的线程池代码如下: package main impor ...

  2. 尝试在条件“$(_DeviceSdkVersion) >= 21”中对计算结果为“”而不是数字的“$(_DeviceSdkVersion)

    晚上搞xamarin ,运行xamarin项目好好的,不知道怎么回事,一次运行xamarin android项目的时候,部署失败,以前也是遇到这样的错误. 尝试在条件"$(_DeviceSd ...

  3. 干货分享!关于APP导航菜单设计你应该了解的一切

    导航菜单是人机交互的最主要的桥梁和平台,主要作用是不让用户迷失方向.现在市面上产品的菜单栏种类繁多,到底什么样的才是优秀的导航菜单设计呢?好的菜单设计不仅能提升整个产品的用户体验,而且还能让用户耳目一 ...

  4. tcpdump 命令详解

    TCPdump: dump  traffic on a network ,根据使用者的定义对网络上的数据包进行截获的一种包分析工具. TCPdump 可以讲网络中传送的数据包的 头信息完全截获下来提供 ...

  5. Linux发行版 CentOS6.5下的分区操作

    本文地址http://comexchan.cnblogs.com/ ,尊重知识产权,转载请注明出处,谢谢! 查询磁盘信息并作分区规划 执行下述命令查询磁盘信息: fdisk -l 可知.数据盘大小50 ...

  6. 全国交通咨询系统 by C++ on Linux

    信息存储 利用邻接表存储城市信息与线路信息,比邻接矩阵更加高效. 主要数据结构 I)Time,规范时间的输入输出格式 II)VNode,头结点,用于建立顶点表,存储城市信息 III)ArcNode,表 ...

  7. Java中读取txt文件中中文字符时,出现乱码的解决办法

    这是我写的一个Java课程作业时,遇到的问题. 问题描述: 我要实现的就是将txt文件中的内容按一定格式读取出来后,存放在相应的数组. 我刚开始运行时发现,英文可以实现,但是中文字符就是各种乱码. 最 ...

  8. Tomcat在windows系统中的防火墙设置

    在Win7下安装Tomcat后,其他机器无法访问到Tomcat服务,需要修改防火墙设置. 控制面板->window防火墙->允许程序通过Windows防火墙通信 将Tomcat目录下\bi ...

  9. BCL和CoreFx的区别

    bcl是.netframework clr 的基础库corefx是.net core clr的基础库

  10. 通过WebSocket实现一个简单的聊天室功能

    WebSocket WebSocket是一个协议,它是是基于TCP的一种新的网络协议,TCP协议是一种持续性的协议,和HTTP不同的是,它可以在服务器端主动向客户端推送消息.通过这个协议,可以在建立一 ...