题目链接:leetcode.
emmm dp[i][j]表示从i到j的最小操作数
当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]=1,i从大往小变(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];
}
};
这篇博客探讨了一个关于LeetCode上的奇怪打印机问题的解决方案。通过动态规划的方法,作者详细解释了如何计算从字符串i到j的最小操作数。在转移方程中,根据字符是否相等来确定状态,并初始化dp矩阵。最终,该算法能在限制时间内找到最小操作数。
392

被折叠的 条评论
为什么被折叠?



