动态规划

664. Strange Printer

2018-10-13  本文已影响13人  想学会飞行的阿番

思路:很显然,使用DP算法,过程如下:
1.dp[i][i] = 1
2.dp[i][i+1] = 1 if s[i] == s[i+1]
or
dp[i][i+1] = 2 if s[i] != s[i+1]
3.以此类推,dp[j][i] = min(dp[j][k]+dp[k+1][i]) k在j,i之间
NOTE:如果s[i] == s[j] dp[j][i]要减一哦
4.输出 dp[0][n-1]
细节:需要三层循环:
因为k的取值范围关系,因此j是从i-1开始递减到0的,而k则是递增

class Solution {
public:
    int strangePrinter(string s) {
        if(n<2)return n;
        vector<vector<int>> dp(n,vector<int>(n,INT_MAX));
        dp[0][0] = 1;
        for(int i =1;i<n;i++)
        {
            dp[i][i] = 1;
            dp[i-1][i] = s[i-1]==s[i]?1:2;
            for(int j = i-2;j>-1;j--)
            {
                for(int k = j;k<i;k++){
                    dp[j][i] = min(dp[j][i],dp[j][k]+dp[k+1][i]);
                    }
            if(s[i] == s[j])
                dp[j][i] --;
            }
            
        }
        return dp[0][n-1];
    }
};

上一篇下一篇

猜你喜欢

热点阅读