力扣每日一题:664. 奇怪的打印机(动态规划|困难)

284 阅读1分钟

664. 奇怪的打印机

分类:

动态规划 困难

题目:

664_1.PNG

收获:

动态规划的思路

二维数组vector的初始化vector<数据类型> 数组名(数组长度,初始化值)

vector<vector<int>> dp(len,vector<int>(len,INT_MAX));

复杂度:

664_2.PNG

代码:

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…

664_3.PNG

//对于字符串,两边字符相等意味着其打印方案由子字段演化而来,不相等则要找所有子区间中最小的方案
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];
    }
};

创作不易,点个赞就是对作者最大的鼓励。