ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 664. 奇怪的打印机

2021-05-24 13:04:39  阅读:276  来源: 互联网

标签:tmp std 打印机 打印 int 664 LeetCode dp


很久没有做题了,这道题目很容易想到用 dp 去做,但是 dp 过程中有一些细节值得记录下来。

题目描述

有台奇怪的打印机有以下两个特殊要求:

  • 打印机每次只能打印由 同一个字符 组成的序列。
  • 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。
    给你一个字符串 s ,你的任务是计算这个打印机打印它需要的最少打印次数。
     
    示例1:
输入:s = "aaabbb"
输出:2
解释:首先打印 "aaa" 然后打印 "bbb"。

示例2:

输入:s = "aba"
输出:2
解释:首先打印 "aaa" 然后在第二个位置打印 "b" 覆盖掉原来的字符 'a'。

提示:

  • 1 <= s.length <= 100
  • s 由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/strange-printer

思路解析

动态规划的思路,我们用dp[i][j]记录打印s的第i位到第j位所需要的最小的次数。
考虑两种情况,
s[i] == s[j],那么我们可以用一次打印,把第i位至第j位全部打印为s[i],然后再考虑打印第i + 1位至第j位。
s[i] != s[j],我们需要记录一个中间值 k,分两段打印,分别是 dp[i][k]dp[k + 1][j]k的取值范围为(i, j),求对应的最小值即可。

\[\left\{ \begin{array}{**lr**} dp(i, j) = dp(i + 1, j) & s(i) = s(j) \\ dp(i, j) = \min_{k = i}^{j - 1}{dp(i, k) + dp(k + 1, j)} & s(i) \neq s(j) \end{array} \right. \]

这里值得注意的一点是,因为我们在求 dp[i][j] 时,需要用到介于 ij 之间的值,因此在求解时需要保证动态规划的计算过程满足无后效性,从后向前递推求解。

代码实现

class Solution {
public:
    int strangePrinter(string s) {
        int n = s.length();
        std::vector<std::vector<int>> dp(n, std::vector<int>(n));
        for(int i = n - 1; i > -1; i--) {
            dp[i][i] = 1;
            for(int j = i + 1; j < n; j++) {
                if(s[i] == s[j]) dp[i][j] = dp[i][j - 1];
                else {
                    int tmp = INT_MAX;
                    for(int k = i; k < j; k++)
                        tmp = std::min(tmp, dp[i][k] + dp[k + 1][j]);
                    dp[i][j] = tmp;
                }
            }
        }
        return dp[0][n - 1];
    }
};

标签:tmp,std,打印机,打印,int,664,LeetCode,dp
来源: https://www.cnblogs.com/xqmeng/p/14803883.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有