664. 奇怪的打印机
分类:
动态规划 困难
题目:
收获:
动态规划的思路
二维数组vector的初始化vector<数据类型> 数组名(数组长度,初始化值)
vector<vector<int>> dp(len,vector<int>(len,INT_MAX));
复杂度:
代码:
dp[i][j]表代表对于字符串的s[i]到s[j]区间的打印方案个数
如果s[i]与s[j]相等,那么打印左端时无需考虑右端的影响,所以
dp[i][j]=dp[i][j-1];
如果s[i]与s[j]不相等,那么方案数即为其区间序列的最小值
图片来源:leetcode-cn.com/problems/st…
//对于字符串,两边字符相等意味着其打印方案由子字段演化而来,不相等则要找所有子区间中最小的方案
class Solution {
public:
int strangePrinter(string s) {
int len = s.length();
vector<vector<int>> dp(len,vector<int>(len,INT_MAX));
for(int i=len-1;i>=0;i--){
//斜对角线都为1方案
dp[i][i]=1;
for(int j=i+1;j<len;j++){
if(s[i]==s[j]){
dp[i][j]=dp[i][j-1];
}else{
for(int k=i;k<j;k++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
}
return dp[0][len-1];
}
};
创作不易,点个赞就是对作者最大的鼓励。