一、Problem


You have a keyboard layout as shown above in the XY plane, where each English uppercase letter is located at some coordinate, for example, the letter A is located at coordinate (0,0), the letter B is located at coordinate (0,1), the letter P is located at coordinate (2,3) and the letter Z is located at coordinate (4,1).

Given the string word, return the minimum total distance to type such string using only two fingers. The distance between coordinates (x1,y1) and (x2,y2) is |x1 - x2| + |y1 - y2|.

Note that the initial positions of your two fingers are considered free so don’t count towards your total distance, also your two fingers do not have to start at the first letter or the first two letters.

Input: word = "CAKE"
Output: 3
Explanation:
Using two fingers, one optimal way to type "CAKE" is:
Finger 1 on letter 'C' -> cost = 0
Finger 1 on letter 'A' -> cost = Distance from letter 'C' to letter 'A' = 2
Finger 2 on letter 'K' -> cost = 0
Finger 2 on letter 'E' -> cost = Distance from letter 'K' to letter 'E' = 1
Total distance = 3

Constraints:

2 <= word.length <= 300
Each word[i] is an English uppercase letter.

二、Solution

方法一:dp

  • 定义状态

    • f[i][j][k]f[i][j][k]f[i][j][k] 表示按下第 iii 个字符时,左指尖在位置 jjj,右指尖在位置 kkk 时的最小移动代价
  • 思考初始化:
    • f[1...n][0...26][0...26]=INFf[1...n][0...26][0...26] = INFf[1...n][0...26][0...26]=INF
  • 思考状态转移方程
    • 如果 f[i−1][j][k]!=INFf[i-1][j][k] != INFf[i−1][j][k]!=INF:

      • f[i][p][k]=min(f[i][p][k],f[i−1][j][k]+dist(j,p))f[i][p][k] = min(f[i][p][k] ,f[i-1][j][k] + dist(j, p))f[i][p][k]=min(f[i][p][k],f[i−1][j][k]+dist(j,p)),f[i−1][j][k]+dist(j,p)f[i-1][j][k] + dist(j, p)f[i−1][j][k]+dist(j,p) 表示左指尖上一次的位置在 jjj 处,为了按下第 iii 个字符,左指尖从 jjj 处移动到 ppp 处需要的代价
      • f[i][j][p]=min(f[i][j][p],f[i−1][j][k]+dist(k,p))f[i][j][p] = min(f[i][j][p] ,f[i-1][j][k] + dist(k, p))f[i][j][p]=min(f[i][j][p],f[i−1][j][k]+dist(k,p)),f[i−1][j][k]+dist(j,p)f[i-1][j][k] + dist(j, p)f[i−1][j][k]+dist(j,p) 表示右指尖上一次的位置在 kkk 处,为了按下第 iii 个字符,右指尖从 jjj 处移动到 ppp 处需要的代价
  • 思考输出:min(f[n][0...26][0...26])min(f[n][0...26][0...26])min(f[n][0...26][0...26]) 表示按下第 n 个字符时,左右手的位置是不确定的,所以需要枚举所有情况。

:j、kj、kj、k 分别是左右指尖上一次所在的位置;因为表格中的字符都是连续的,所以可直接用 26 个字母的编号 v ∈ [0, 25] 来代替网格的坐标运算,在计算坐标时可以用 v/6、v%6 的方式获取点的坐标 x、y

class Solution {int dist(int a, int b) {int x1 = a / 6, y1 = a % 6;int x2 = b / 6, y2 = b % 6;return Math.abs(x1-x2) + Math.abs(y1-y2);}public int minimumDistance(String word) {char[] cs = word.toCharArray();int n = cs.length, INF = 0x3f3f3f3f, f[][][] = new int[n+1][26][26];   //利用字符编号代替坐标点for (int i = 1; i <= n; i++)for (int j = 0; j < 26; j++) {Arrays.fill(f[i][j], INF);}for (int i = 1; i <= n; i++) for (int j = 0; j < 26; j++) for (int k = 0; k < 26; k++) {int p = cs[i-1] - 'A';if (f[i-1][j][k] != INF) {f[i][p][k] = Math.min(f[i][p][k], f[i-1][j][k] + dist(j, p));   //移动左指f[i][j][p] = Math.min(f[i][j][p], f[i-1][j][k] + dist(k, p));   //移动右指}}int min = INF;for (int j = 0; j < 26; j++) for (int k = 0; k < 26; k++) if (f[n][j][k] < min) {min = f[n][j][k];}return min;}
}

复杂度分析

  • 时间复杂度:O(262×n)O(26^2 × n)O(262×n),
  • 空间复杂度:O(262×n)O(26^2 × n)O(262×n),

方法二:空间压缩

按下第 iii 个字符的状态只和按下第 i−1i-1i−1 个字符的状态有关,所以可利用滚动思想,将 dp 数组的第一维从 n 压缩成 2

...代办

复杂度分析

  • 时间复杂度:O(n)O(n)O(n),
  • 空间复杂度:O(262)O(26^2)O(262),

【网格 dp】A005_LC_二指输入的的最小距离(枚举上一个状态)相关推荐

  1. LeetCode 1320. 二指输入的的最小距离(动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 二指输入法定制键盘在 XY 平面上的布局如上图所示,其中每个大写英文字母都位于某个坐标处, 例如字母 A 位于坐标 (0,0),字母 B 位于坐标 (0, ...

  2. 1320二指输入的最小距离

    1320二指输入的最小距离 错误思路: dp[i][j][k]表示当前状态下的最小距离, i表示第i个字母,j表示左手还是右手, k表示第一次右手是否使用过(默认左手起步,所以无需管第一次左手), 但 ...

  3. 状压dp之二之三 炮兵阵地/玉米田 By cellur925

    一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...

  4. UR机械臂学习(6):使用robotiq二指夹爪

    在ros中下载的ur机器人包里不包括夹爪.力传感器等Robotiq的产品. Robotiq相关产品的ros功能包可以在 https://github.com/ros-industrial/roboti ...

  5. 机械臂论文笔记(一)【基于卷积神经网络的二指机械手 抓取姿态生成研究 】

    基于卷积神经网络的二指机械手 抓取姿态生成研究 论文下载 摘要 第1章 绪论 1.1 抓取生成国内外研究现状 1.1.1已知物体抓取生成 1.1.2相似物体抓取生成 1.1.3 未知物体抓取生成 1. ...

  6. robot_iq二指手爪控制和robot_iq力传感器的接收

    作者是在Ubuntu16.04 ROS kinetic版本中编译控制的 首先从官网上或者github上下载力传感器和手爪控制的功能包(官方的功能包中包含二指和三指夹爪的控制),如果找不到,可以去本人共 ...

  7. 作为一个程序员,敲代码还是二指禅??? 教你几招,让你打字速度飞起

    同一个人在不同的打字环境下,速度是不同的.打字环境包括三种:看打.想打.听打.所以,在追求打字速度的时候,要先确认自己是在什么样的打字环境下打字.因为这会决定什么样的输入法适合你.工欲善其事,必先利其 ...

  8. 联想触摸板只能单击,二指三指失效

    问题背景 这问题是我笔记本两三年前重装win10系统后出现的,当时有鼠标懒得弄.今天发现没鼠标后,触摸板连二指滑动都没有太麻烦了,所以决定弄一下. 联想笔记本,win10系统重装后出现的问题. 1.鲁 ...

  9. 双臂二指魔方机器人的制作(二)--视觉识别

    本文素材来源于广西大学 机械工程学院 作者:孙尹同  黄祖杰 指导老师:李俚 1.方案选择 根据硬件实际需求以及本团队能力需求,视觉颜色的识别是本项目的不可缺少的一部分,方案的选择主要有一下三种类型: ...

最新文章

  1. 9.65 最长上升子序列
  2. JavaScript函数大全
  3. 开机自启动win7计划任务
  4. 技术分享连载(六十四)
  5. http --- 基本认证与摘要认证
  6. 技巧 | 在R语言中使用高德地图的API进行地理/逆地理编码(地址与经纬度的相互转换)...
  7. 一条长为L的绳子,一面靠墙,另外三边组成矩形,问此矩形最大面积能是多少?...
  8. 高性能mysql系统设计_MySQL 高性能表设计规范
  9. springboot 乱码之URLDecoder解析
  10. 微信 华为盒子 搜索不到服务器,【沙发管家教你一招】用手机微信控制华为荣耀盒子!...
  11. STM32教程(库函数版):STM32库函数开发实例教程
  12. r语言 svycoxph_生存分析的Cox回归模型(比例风险模型)R语言实现及结果解读
  13. java 图片标注_怎么用java做一个图像细胞的标注测试的工具?,实现图片放大,框图,定位坐标?...
  14. 7. Mayavi入门
  15. linux 7分区 fdisk,CentOS7创建逻辑卷,fdisk分区方式。
  16. 外贸企业邮箱开通入口,企业邮箱开通全流程攻略
  17. Spark Broadcast内幕解密
  18. 计算机用户输入信息怎么保存,计算机中的全部信息,包括输入的原始数据、计算机程序、中间运行结果都保存在存储器中...
  19. 计算机及应用自考顺序,自考计算机应用专业科目学习次序
  20. 网络安全行业的权威职业证书大揭秘

热门文章

  1. CentOS 7.6安装JDK8过程(通过官网下载压缩包方式)
  2. Parameter 参数与 Argument 参数
  3. arduino 天下第一(暴论) -- 智能猫眼与 SDDC 连接器移植到 arduino 上
  4. Icon Status CDS视图 添加信号灯状态 Fiori Element- Criticality
  5. 计算机图形学(四)几何变换_4_二维复合变换_4_二维刚体变换
  6. R语言ggplot2可视化散点图(scatter plot)、使用scale_size函数自定义指定散点大小的度量、scale_fill_distiller函数自定义指定散点的颜色映射(填充色的度量)
  7. iOS 15 UITableView Section间距变大
  8. 审视自己也是一种进步
  9. 大数据风控项目实战 Drools规则引擎
  10. 金银岛(信息学奥赛一本通 - T1225)