[51nod1373]哈利与他的机械键盘
作为一名屌丝程序员,机械键盘是哈利梦寐以求的神器。终于,在除夕夜的时候,他爸爸送了他一个机械键盘。
哈利的键盘与我们平常所见到的的键盘不一样,我们可以认为他的键盘是一个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]哈利与他的机械键盘的更多相关文章
- Tickeys -- 找对打字的感觉 (机械键盘音效软件)
最近发现公司里面越来越多人开始用机械键盘了,问了很多人为什么用机械键盘,主要有两种,一种是真的情怀,他们怀念十年前那种台式机硬邦邦的键盘,另外一种是因为喜欢机械键盘的声音,打字很爽.前者那真是没救了, ...
- 技术分享:逆向海盗船k95机械键盘
引文 在几年前我买了一个海盗船 K95 Vengeance机械键盘,键盘有上有背光功能,于是我在考虑是不是可以修改一下.但作者表示购买来的键盘上面没有很多的资料可供利用,需要注意的是,新版的K95与旧 ...
- apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard
apple mac 下使用机械键盘的办法,键盘映射工具软件,apple mac Mechanical keyboard 想在苹果电脑 mac 系统下使用 机械键盘,大部分机械键盘不是为mac设计的,所 ...
- mac下的改装人生——关于机械键盘
这几天好像弄了很多关于机械键盘的东西,我自己的这块键盘也已经慢慢熟悉了,感觉打字超级爽哈,然后看了很多网上关于机械键盘的帖子,也看了很多教程,在Amazon和Taobao看了很多键盘的价位,前几天还试 ...
- 第一把机械键盘 ikbc C-87
终于入了机械键盘,ikbc C-87黑色红轴. 原本上周五晚上就到了,但是那个键盘有几个键弹起后弹簧会持续响,敲了一会,实在不能忍受,就申请换货了.新换的键盘今天终于到了,没有了之前的问题,但是几乎每 ...
- mac 10.12 sierra 机械键盘+ratm可编程鼠标记录
系统:mac 10.12 sierra 键盘:机械键盘 鼠标:mad catz ratm 在mac 10.11/10.12 之前: 机械键盘:一般的机械键盘在mac上使用, alt 和 win 键 ...
- 普通键盘Windows上虚拟Cherry机械键盘效果的方法
草台班子--普通键盘Windows上虚拟Cherry机械键盘效果的方法 机械键盘以其独特的手感.绚丽的外形,还有那人神共愤的音效吸引着大批爱好者.最近iQQO 3的机械键盘效果更是吸引了更多 ...
- 从零DIY机械键盘/主控方案
自从有了第一套机械键盘,先后修改了接口方案,安装了LED灯等,但是始终无法满足自己的DIY欲望. 于是想到最简单的方法就是用现成的主控,而主控来源于废弃的键盘,如下图: 这种主控也是矩阵方式,只需要测 ...
- 惠普机械键盘 K10GL 使用评测
惠普机械键盘 GK100 使用评测 手感太差,不是 RGB 背光 惠普(HP) K10GL 机械键盘 有线 LED背光机械键盘 87键 混光青轴 refs https://item.jd.com/10 ...
随机推荐
- HTTP服务及状态码
第一章 HTTP 1.1 HTTP协议的概念 HTTP协议,全称HyperText Transfer Protocol,中文名为超文本传输协议,是互联网上常用的通信协议之一,它有很多的应用.但是流行的 ...
- Cat 跨线程之 ForkedTransaction 用法和原理分析
代码 package com.dianping.cat.message.internal; import com.dianping.cat.Cat; import com.dianping.cat.m ...
- Docker入门书籍
https://yuedu.baidu.com/ebook/d817967416fc700abb68fca1 精细讲解,入门使用极佳.
- Python函数篇(7)-正则表达式
1.正则表达式 正则表达式为高级的文本模式匹配,抽取,与/或文本形式的搜索和替换功能提供了基础,简单的来说,正则表达式是由一些字符和特殊符号组成的字符串.Python通过标准库中的re模块来支持正 ...
- mysql change master导致gtid丢失
change master导致gtid丢失从innobackupex恢复导致binlog的拉取位置会导致主备gtid不一致.此类错误通过构造空事务方式无法修复.此时就需要change master 方 ...
- WPF下可编辑Header的Tab控件实现
介绍 有这样一个需求,当用户双击Tab控件Header区域时, 希望可以直接编辑.对于WPF控件,提供一个ControlTemplate在加上一些Trigger就可以实现.效果如下: 代码 首先,我们 ...
- ABP架构学习系列三:手工搭建ABP框架
由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC.AOP.ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢 ...
- 常用的 css reset,基本的base.css
@charset "utf-8"; html { overflow-x: hidden; overflow-y: auto; } /*隐藏横向滚动,垂直滚动根据内容自 ...
- GPS校时器,GPS时钟装置,NTP网络时间服务器
GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间服务器 GPS校时器,GPS时钟装置,NTP网络时间 ...
- (译)Web是如何工作的(3):HTTP&REST
原文地址:https://medium.freecodecamp.org/how-the-web-works-part-iii-http-rest-e61bc50fa0a 我们在第一篇文章中介绍了 ...