COJ 2192: Wells弹键盘 (dp)
2192: Wells弹键盘
Description
Wells十分羡慕和佩服那些会弹钢琴的人比如子浩君,然而Wells只会弹键盘…… Wells的键盘只有10个键,从1,2,3,……,9,0,如下图所示:

而且作为一个正常人,Wells也有两只手,但是为了显示出自己高超的弹键盘水平,Wells决定每只手只动用一个手指,左手指和右手指,来进行按键操作,初始左右手指分别在5,6两个按键上。每一个单位时间(1s),对于一个手指,Wells可以进行如下操作之一:
- 按下位于手指位置的按键。
- 将手指向左或向右移动一格,当然不能移到键盘外面。
必须注意以下几点:
- 在任意时刻,正常人左手指都必须在右手指的左边,当然右手指就在左手指的右边。
- 在一个单位时间内,只有一个手指可以按下按键。当然,另一个手指还是可以移动的。
现在,给Wells得到一个高级键盘谱(一个仅含0~9的非空字符串)可以在梦里弹出不输于钢琴的旋律,但强迫症Wells一定要知道高级键盘谱弹奏最少要几秒才能弹完,但Wells数学太差了,所以Wells求助于你,本世纪最优秀的程序yuan之一来帮助他!
Input
输入文件有若干行,每行描述一组数据。 对于每组数据仅一行,一个数字串s。
Output
输出若干行,每行为对应输入数据的答案。
Sample Input
434
56
57
Sample Output
5
2
2
Hint
对于20%的数据,0<=length(s)<=5,且数据组数不超过3组; 对于100%的数据,0<=length(s)<=100,且数据组数不超过100组; 保证数据中间没有空行;
Source
解题思路:定义一个三维数组dp[l][r][t]:
其中,l表示左手所在位置,r表示右手所在位置,t表示当前时间,pos表示当前应弹字符的位置,也表示已弹的字符数量。
我们可以从初始状态dp[5][6][0]=0开始遍历时间,每次从当前时间的状态推导下一秒的状态,再取最优。若pos等于给定字符串长度表示已经弹完,结束枚举。对于每个已知状态而言,下一秒共有15个可能的状态能由该状态推导得出。枚举这15个状态即可得出状态转移方程。
#include <iostream>
#include<cstdio>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<cstring> using namespace std;
const int INF=1e9;
int dp[][][];
int main()
{
string s;
int len,ans;
while(cin>>s){
len=s.length();
ans=INF;
memset(dp,-,sizeof(dp));
dp[][][]=;
for(int t=;t<=*len;t++){
for(int l=;l<=;l++){
for(int r=;r<=;r++){
if(r<=l) continue;
if(dp[l][r][t]==len){
ans=t;
break;
}
if(l+''==s[dp[l][r][t]]){
dp[l][r][t+]=max(dp[l][r][t+],dp[l][r][t]+);
if(r+<=)
dp[l][r+][t+]=max(dp[l][r+][t+],dp[l][r][t]+);
if(r->l)
dp[l][r-][t+]=max(dp[l][r-][t+],dp[l][r][t]+);
}
if(r%+''==s[dp[l][r][t]]){
dp[l][r][t+]=max(dp[l][r][t+],dp[l][r][t]+);
if(l->=)
dp[l-][r][t+]=max(dp[l-][r][t+],dp[l][r][t]+);
if(l+<r)
dp[l+][r][t+]=max(dp[l+][r][t+],dp[l][r][t]+);
}
if(l+<r+ && r+<=)
dp[l+][r+][t+]=max(dp[l+][r+][t+],dp[l][r][t]);
if(l+<r)
dp[l+][r][t+]=max(dp[l+][r][t+],dp[l][r][t]);
if(l+<r-)
dp[l+][r-][t+]=max(dp[l+][r-][t+],dp[l][r][t]); if(l<r+ && r+<=)
dp[l][r+][t+]=max(dp[l][r+][t+],dp[l][r][t]);
if(l<r)
dp[l][r][t+]=max(dp[l][r][t+],dp[l][r][t]);
if(l<r-)
dp[l][r-][t+]=max(dp[l][r-][t+],dp[l][r][t]); if(l-<r+ && r+<= && l->=)
dp[l-][r+][t+]=max(dp[l-][r+][t+],dp[l][r][t]);
if(l-<r && l->=)
dp[l-][r][t+]=max(dp[l-][r][t+],dp[l][r][t]);
if(l-<r- && l->=)
dp[l-][r-][t+]=max(dp[l-][r-][t+],dp[l][r][t]);
}
if(ans!=INF)break;
}
if(ans!=INF)break;
}
printf("%d\n",ans);
}
return ;
}
COJ 2192: Wells弹键盘 (dp)的更多相关文章
- POJ 2192 :Zipper(DP)
http://poj.org/problem?id=2192 Zipper Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1 ...
- poj 2192 Zipper(区间dp)
题目链接:http://poj.org/problem?id=2192 思路分析:该问题可以看做dp问题,同时也可以使用dfs搜索求解,这里使用dp解法: 设字符串StrA[0, 1, …, n]和S ...
- IOS下HTML5获取焦点 弹键盘
IOS下sifari和webview默认屏蔽textarea/inputbox获取焦点弹出键盘 苹果移动设备的WebView默认屏蔽textarea/inputbox获取焦点弹出键盘,需要在APP页面 ...
- COJ 1208 矩阵快速幂DP
题目大意: f(i) 是一个斐波那契数列 , 求sum(f(i)^k)的总和 由于n极大,所以考虑矩阵快速幂加速 我们要求解最后的sum[n] 首先我们需要思考 sum[n] = sum[n-1] + ...
- csu-2018年11月月赛Round2-div1题解
csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...
- UWP webview 键盘bug,回退页面,键盘会弹一下。
最新项目发现一个关于Webview的键盘bug. 具体问题:当点击Webview 网页里面input之类的东东,输入键盘会弹出来,这个时候,按回退键,键盘会收起来,再按回退键,界面会退到前一个页面,但 ...
- love yy-kiss 医生出差二期
医生出差二期,做了一半撤出去做互联网医院了 http://confluence.haodf.net/pages/viewpage.action?pageId=15801359 医生出差二期 没设置数 ...
- android:windowSoftInputMode及其他部分属性用法
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 今天我们来讲讲android:windoSoftInputMode的用法,许多同学会为软键盘的弹出. ...
- 移动端 常见布局CSS3的细节
结合 Framework7 和ios UI系统,微信weUI,支付宝H5 我们在移动端一些css用法 细节的有了更深的了解: 高斯模糊的显示效果,ios8以上支持,ios8以上0.5px,bac ...
随机推荐
- mobileeye
if a human can drive a car based on vision alone – so can a computer. 但是目前哪家能做到?
- 分享一个带有合计行功能的DataGridView扩展
因为一个Winform的项目中需要用到带有合计行的表格,并且需要满足以下需求: 合计行可自动对需要求和的列进行求和计算; 合计行必须固定(冻结)在表格的最底部,且其位置不受滚动条的滚动而移动; 可以设 ...
- [Oracle]分区索引
上一节学习了分区表,接着学习分区索引. (一)什么时候对索引进行分区 · 为了避免移动数据时重建整个索引,可对索引分区,在重建索引时,只需重建与数据分区相关的索引: · 在对分区表进行维护时,为了避免 ...
- rest_framework--序列化组件
#####序列化组件##### 一.什么是序列化 在python中一切皆对象,把对象从内存中变成可存储或传输的过程称之为序列化. 你写一个django项目肯定是有前后端交互的吧,虽然django也可以 ...
- web 打印功能
在项目开发中有时候会碰到要求打印页面中的数据的功能需求.需求原因主要有两点吧,一是需要打印的数据只是页面的一部分即页面的区域打印,比如只需要打印页面中表格里面选中的数据等,二是需要打印出来的样式和页面 ...
- vue过渡动画效果
1 过渡基础 1.1 过渡的方式 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果. 包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS ...
- php post提交xml文件
<?php header("Content-type: text/xml;"); // xml code demo $xmlData = '<?xml version= ...
- 首层nginx 传递 二级代理,三级代理......多级代理nginx 客户端真实IP的方法
首层nginx(172.25.10.1):先获取真实IP($remote_addr),再将真实IP传递给X-Forwarded-For proxy_set_header X-Real-IP $r ...
- wamp环境下安装imagick扩展
先上图,如下是安装成功后的phpinfo()界面: 安装步骤: 1.先确定安装版本,比如我的的php : php7.0.12 x86 ts 那么就需要三方版本 要一致:imagick软件本身( 如x ...
- Python的Bottle框架中实现最基本的get和post的方法的教程
这篇文章主要介绍了Python的Bottle框架中实现最基本的get和post的方法的教程,Bottle框架在Python开发者中的人气很高,需要的朋友可以参考下 1.GET方式: # -*- cod ...