2020-5 leetcode 664. 奇怪的打印机

1.思路:对每一段相同类型且连续的字母看成一个整体。对当前的整体,可以选择现在打印(此时打印总次数 加 1+打印后面所需最少次数)。也可以选择与后面与之类型相同的整体一起打印(此时打印次数 加这两段中间的那段字符串所需最少的打印次数,加打印后面所需最少次数)。

2.实现这个思路,用的是递归加记忆化(也可以改写成动态规划)

class Solution {
public:
    int strangePrinter(string s) {
        int n=s.size();
        if(n==0) return 0;
        vector<vector<int>> dp(n,vector<int>(n,-1));
        int ans=back(s,0,s.size()-1,dp);
        return dp[0][n-1];
    }
    int back(string s1,int l,int r,vector<vector<int>>& dp){
        if(l>r) return 0;
        if(dp[l][r]>-1) return dp[l][r];
        int e=l+1;
        for(;e<=r;e++){
            if(s1[e]!=s1[l]) break;
        }
        int ans=back(s1,e,r,dp)+1;
        int f=e;
        for(;f<=r;f++){
            if(s1[f]==s1[l]&&s1[f-1]!=s1[l]){
               ans=min(ans,back(s1,e,f-1,dp)+back(s1,f,r,dp));
            }
        }
        dp[l][r]=ans;
        return ans;
    }
};

你可能感兴趣的:(leetcode)