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 ...
随机推荐
- 【luogu P3627 [APIO2009]抢掠计划】 题解
题目链接:https://www.luogu.org/problemnew/show/P3627 把点权转化到边权上去. #include <stack> #include <que ...
- 初学oracle遇到些小麻烦
前段时间学习了Oracle数据库,在超级用户sys下运行一些基本语句的时候都没有发现有什么问题,但是却发现不能执行删除字段的的命令,老师检查说可能是权限不够,但是在授权之后依旧不能完成该语句,所以就另 ...
- rank() over,dense_rank() over,row_number() over的区别
rank() over,dense_rank() over,row_number() over的区别 1.rank() over:查出指定条件后的进行排名.特点是,加入是对学生排名,使用这个函数,成绩 ...
- linux tail + head 查看指定行
取出一段数据后,需要获取指定行 file # 前10行 file # 不要最后10行的前面所有行 file # 后10行 file # 不要前面10行的后面所有行 | # 不要前后10行剩余的所有行
- 解决Nginx: [error] open() "/usr/local/Nginx/logs/Nginx.pid" failed(2:No such file or directory)
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- Co. - Microsoft - Windows - 通过任务计划,备份本地MySQL,数据上传Linux备份服务器
需求 客户为Windows系统,安装MySQL,需要每日备份数据库到指定目录,并且上传到公司的备份服务器(Linux). 1.使用mysqldump备份MySQL数据库,使用FTP上传到阿里云Linu ...
- Python——判断
if语句简介 说明 使用if语句判断的条件表达式的结果只有两种:Ture和False,结果为True则执行if语句中的代码,否则不执行,例: name = "smith" if n ...
- MYSQL 版本5.7.24 sql_mode=only_full_group_by问题
具体出错提示: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggr ...
- PHP判断URL地址百度是否已经收录并主动提交MIP数据
/** * PHP检测URL地址百度是否已经收录 * @param string $url 要检测的URL地址 */ function Baidu($url) { $url = 'http://www ...
- Jackson 触发的String.intern() bug, 导致内存持续增加,JVM-Java内存泄漏
我在本地用Jackson可以复现这个问题了. import java.io.IOException; import java.util.Map; import java.util.Random; im ...