664. 奇怪的打印机

这篇博客探讨了一个关于LeetCode上的奇怪打印机问题的解决方案。通过动态规划的方法,作者详细解释了如何计算从字符串i到j的最小操作数。在转移方程中,根据字符是否相等来确定状态,并初始化dp矩阵。最终,该算法能在限制时间内找到最小操作数。

题目链接:leetcode.

emmm dp[i][j]表示从ij的最小操作数
s[i] == s[j]时,dp[i][j] = dp[i][j-1],因为在打印s[i]的时候把s[j]可以一起打了,不影响中间的s[i+1 : j-1]
s[i] != s[j]时,左右两边要分开打印,分界线为s[k]dp[i][j] = min(dp[i][k-1] + dp[k][j])i<k<=j
转移方程初始条件为dp[i][i]=1i从大往小变(k > i),j从小往大变(k < j, j - 1 < j)

/*
执行用时:112 ms, 在所有 C++ 提交中击败了16.61%的用户
内存消耗:9.2 MB, 在所有 C++ 提交中击败了68.96%的用户
*/
class Solution {
public:
    int strangePrinter(string s) {
        int N = s.size();
		vector<vector<int>> dp(N, vector<int>(N, 1));
		for(int i = N - 1;i >= 0;--i)
		{
			for(int j = i + 1;j < N;++j)
			{
				if(s[i] == s[j])
					dp[i][j] = dp[i][j - 1];
				else
				{
					int minn = INT_MAX;
                    // cout << i <<' ' << j << endl;
					for(int k = i + 1;k <= j;++k)
					{
						minn = min(minn, dp[i][k - 1] + dp[k][j]);
					}
					dp[i][j] = minn;
				}
			}
		} 
		return dp[0][N - 1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值