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个状态即可得出状态转移方程。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<set>
 4 #include<queue>
 5 #include<vector>
 6 #include<map>
 7 #include<cmath>
 8 #include<cstdlib>
 9 #include<algorithm>
10 #include<string>
11 #include<cstring>
12
13 using namespace std;
14 const int INF=1e9;
15 int dp[11][11][1050];
16 int main()
17 {
18     string s;
19     int len,ans;
20     while(cin>>s){
21         len=s.length();
22         ans=INF;
23         memset(dp,-1,sizeof(dp));
24         dp[5][6][0]=0;
25         for(int t=0;t<=10*len;t++){
26             for(int l=1;l<=10;l++){
27                 for(int r=1;r<=10;r++){
28                     if(r<=l)    continue;
29                     if(dp[l][r][t]==len){
30                         ans=t;
31                         break;
32                     }
33                     if(l+'0'==s[dp[l][r][t]]){
34                         dp[l][r][t+1]=max(dp[l][r][t+1],dp[l][r][t]+1);
35                         if(r+1<=10)
36                             dp[l][r+1][t+1]=max(dp[l][r+1][t+1],dp[l][r][t]+1);
37                         if(r-1>l)
38                             dp[l][r-1][t+1]=max(dp[l][r-1][t+1],dp[l][r][t]+1);
39                     }
40                     if(r%10+'0'==s[dp[l][r][t]]){
41                         dp[l][r][t+1]=max(dp[l][r][t+1],dp[l][r][t]+1);
42                         if(l-1>=1)
43                             dp[l-1][r][t+1]=max(dp[l-1][r][t+1],dp[l][r][t]+1);
44                         if(l+1<r)
45                             dp[l+1][r][t+1]=max(dp[l+1][r][t+1],dp[l][r][t]+1);
46                     }
47                     if(l+1<r+1 && r+1<=10)
48                         dp[l+1][r+1][t+1]=max(dp[l+1][r+1][t+1],dp[l][r][t]);
49                     if(l+1<r)
50                         dp[l+1][r][t+1]=max(dp[l+1][r][t+1],dp[l][r][t]);
51                     if(l+1<r-1)
52                         dp[l+1][r-1][t+1]=max(dp[l+1][r-1][t+1],dp[l][r][t]);
53
54
55                     if(l<r+1 && r+1<=10)
56                         dp[l][r+1][t+1]=max(dp[l][r+1][t+1],dp[l][r][t]);
57                     if(l<r)
58                         dp[l][r][t+1]=max(dp[l][r][t+1],dp[l][r][t]);
59                     if(l<r-1)
60                         dp[l][r-1][t+1]=max(dp[l][r-1][t+1],dp[l][r][t]);
61
62                     if(l-1<r+1 && r+1<=10 && l-1>=1)
63                         dp[l-1][r+1][t+1]=max(dp[l-1][r+1][t+1],dp[l][r][t]);
64                     if(l-1<r && l-1>=1)
65                         dp[l-1][r][t+1]=max(dp[l-1][r][t+1],dp[l][r][t]);
66                     if(l-1<r-1 && l-1>=1)
67                         dp[l-1][r-1][t+1]=max(dp[l-1][r-1][t+1],dp[l][r][t]);
68                 }
69                 if(ans!=INF)break;
70             }
71             if(ans!=INF)break;
72         }
73         printf("%d\n",ans);
74     }
75     return 0;
76 }

View Code

转载于:https://www.cnblogs.com/zengzk/p/10076817.html

COJ 2192: Wells弹键盘 (dp)相关推荐

  1. hdu 5259 弹吉他 · dp

    题解 四根手指按四根弦,总共有4!=24种不同的按法,预处理所有的按法 对每种合法状态进行状态转移,路径是曼哈顿距离之和 太久没做dp,特么想多了... #include <bits/stdc+ ...

  2. 【算法基础】DP第一弹 —— 线性DP 区间DP

    一.数字三角形 (一)Question 1. 问题描述 2. Input 第一行包含整数 n,表示数字三角形的层数.接下来 n 行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数. ...

  3. csu-2018年11月月赛Round2-div1题解

    csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...

  4. android平板对接扫码枪,切换输入设备弹出键盘问题

    本来可以切换成虚拟串口,但是已经有另外一个设备对接串口了,再加上usb转串口模式调试起来费时费力,项目赶就用了简单的输入输入方式,就等于扫码枪类似一个外接键盘,但是应用效果希望无感,所以用了一个比较取 ...

  5. Android设置EditText弹出软键盘

    final EditText editText = findViewById(R.id.et); editText.selectAll(); //默认选中EditText中的所有内容 editText ...

  6. iOS 即时聊天键盘处理

    1 让tableview 滚动到最底层方法 if (_dataArr.count>0) { NSIndexPath *ip = [NSIndexPath indexPathForRow:_dat ...

  7. ikbc机械键盘打字出现重复_超小无线机械键盘,绝佳移动打字体验

    NuType 筹资信息 产品名称NuType 上线平台Kickstarter 发起团队NUPHY 发起地区中国香港 目标金额80,000HKD 筹集金额1,301,212HKD 完全进度1,627% ...

  8. 酒浓码浓 - ios进入页面自动弹出键盘

    ios移动端进入页面怎么自动弹出键盘 最近做的H5页面业务上有个需求,要在移动端,进入到某个页面自动聚焦input的焦点并弹出软键盘!!! 查了一圈,发现autofocus,在android上只能聚焦 ...

  9. 第13期:动态规划-dp题集

    1 P7972 [KSN2021] Self Permutation //[动态规划1]动态规划的引入 2 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangle ...

最新文章

  1. (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  2. Redis 数据结构的底层实现 (二) dict skiplist intset
  3. java inputstream的read一次只能读到一个字节_20210118-JAVA面试题
  4. nginx禁止未绑定域名访问返回444
  5. ScrollView中嵌入Listview,当item高度不一样的时候,item展示不全问题
  6. 多设备同步表数据_利用Excel数据透视表解决两份报表数据不同步问题
  7. == 和 is 的区别
  8. jmeter单线程读取csv_jmeter中如何使用csv文件并读取数据
  9. 再谈编程范式—程序语言背后的思想
  10. python3菜鸟教程
  11. 清华本科结业生两年的工作经历-献给游走在黑暗里的清华人
  12. (转)CGJ02、BD09、西安80、北京54、CGCS2000常用坐标系详解
  13. 柠檬班高性能测试jmeter loadrunner 11期
  14. Hi3519V101移植SDL+FreeType+SDL_ttf
  15. MBA面试系列之----中文面试宝典(一)
  16. 知识图谱与图神经网络_biji
  17. FTS数据库优化(Android)原理与应用详解(1)
  18. 使用indexedDB(三)(翻译)
  19. 制度是绝情的,管理是无情的,执行是合情的
  20. 那个服务器的联盟最多的,魔兽世界联盟最多的服务器是哪个

热门文章

  1. win7 安装Redis
  2. linux: convmv =-======pkgs.org
  3. Subsonic使用中
  4. 【新手向】jQuery Mobile中动态加载或执行脚本的分析
  5. 【原创】Kakfa metrics包源代码分析
  6. 2013-10-31 《October 31st, 2013》
  7. 2015人脸检测研究进展
  8. Ubuntu 16.04 LTS下编译GPU版tensorflow
  9. Google I/O大会,炫酷产品汇总
  10. Android中级篇之百度地图SDK v3.5.0-百度地图定位[超详细图解定位基础]