LeetCode 650. 只有两个键的键盘(DP)

本文探讨了一个有趣的算法问题——两键键盘。通过动态规划的方法,我们寻找最少的操作次数,以在记事本上打印出恰好n个字符'A'。文章详细介绍了动态规划的实现过程,包括状态转移方程和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目

最初在一个记事本上只有一个字符 ‘A’。你每次可以对这个记事本进行两种操作:

  • Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。
  • Paste (粘贴) : 你可以粘贴你上一次复制的字符。

给定一个数字 n 。你需要使用最少的操作次数,在记事本中打印出恰好 n 个 ‘A’。输出能够打印出 n 个 ‘A’ 的最少操作次数。

示例 1:
输入: 3
输出: 3
解释:
最初, 我们只有一个字符 'A'。
第 1, 我们使用 Copy All 操作。
第 2, 我们使用 Paste 操作来获得 'AA'。
第 3, 我们使用 Paste 操作来获得 'AAA'。
说明:
n 的取值范围是 [1, 1000]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/2-keys-keyboard
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 动态规划

  • dp[i] 表示打印 i 个字符的最少操作次数,初始为 i 次(每次粘贴一个字符)
  • 要打印 i 个字符,它可以由前面的 j 个字符,复制全部+粘贴过来,前提是他们之间是约数
class Solution {
public:
    int minSteps(int n) {
        vector<int> dp(n+1,0);
        int i, j;
        for(i = 2; i <= n ; ++i)
        {
        	dp[i] = i;	//一直粘贴的次数
        	for(j = 2; j < i; ++j)
        	{
        		if(i%j == 0)
        			dp[i] = min(dp[i], dp[j]+i/j);
        	}
        }
        return dp[n];
    }
};

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值