前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >650. 只有两个键的键盘 Krains 2020-08-02 09:39:39 动态规划DFS

650. 只有两个键的键盘 Krains 2020-08-02 09:39:39 动态规划DFS

作者头像
Krains
发布2020-08-05 11:50:20
2110
发布2020-08-05 11:50:20
举报
文章被收录于专栏:KrainsKrains

# 题目链接

# DFS+记忆化

解题思路

  • 每次有两种选择,一种是Copy All,一种是Paste,可以用dfs模拟两次选择,找到满足恰好打印出n个'A'的最少的操作次数,需要注意的是要判断当前状态是否可以Copy All或者Paste,如当前已经执行了一次Copy All,下一次就无需复制了,如果当前剪贴板上没有字符,那么也不要进行Paste操作,如果没有判断,会永远递归下去,直到栈溢出。
  • 通过dfs很容易看出,当当前字符数cur和剪贴板字符数last一定时,dfs总是返回相同的最小操作次数,因此可以使用记忆化。
代码语言:javascript
复制
class Solution {
    int INF = (int)1e9;

    public int minSteps(int n) {
        return helper(n, 1, 0, new Integer[n+1][n+1]);
    }

    // n是所需字符,cur是当前字符数,last是上一次复制的字符数,memo是记忆数组
    public int helper(int n, int cur, int last, Integer[][] memo){
        // 如果当前字符cur超过了n,此状态不合法,返回INF,
        // 我们会对操作次数取min,因此不会选取到INF这个状态
        if(n < cur)
            return INF;
        else if(n == cur)
            return 0;
        if(memo[cur][last] != null)
            return memo[cur][last];

        int count = INF;
        // 第一次递归代表Copy All,当cur==last时,表示已经复制过了,无需再复制
        if(cur != last)
            count = Math.min(count, helper(n, cur, cur, memo) + 1);
        // 第二次递归代表Paste,只有当上次复制有字符时Paste才有意义,否者只会徒增步数
        if(last != 0)
            count = Math.min(count, helper(n, cur+last, last, memo) + 1);

        return memo[cur][last] = count;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 题目链接
    • # DFS+记忆化
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档