[Leetcode]664. Strange Printer

来源:互联网 发布:手机虚拟歌姬软件 编辑:程序博客网 时间:2024/06/05 01:03

[Leetcode]664. Strange Printer

Description

664. Strange Printer

Analysis

此题可以采取动态规划的想法。具体做法如下:

Stary 2017-09-30 at 9.35.17 A

时间复杂度:O( n^2 ), 空间复杂:O( n^2 )

code

#include <iostream>#include <vector>using namespace std;class Solution {public:    int strangePrinter(string s) {        if (s.length() == 0) { return 0; }        string unique_s;        unique_s += s[0];        for (int i = 1; i < s.length(); i++) {            if (s[i] != s[i - 1]) {                unique_s += s[i];            }        }        vector<vector<int>> matrix(unique_s.length(), vector<int>(unique_s.length(), 0));        return dp(matrix, unique_s, 0, unique_s.length() - 1);    }    int dp(vector<vector<int>> &matrix, string s, int i, int j) {        if (i == j) { return 1; }        if (i > j) { return 0; }        if (matrix[i][j] != 0) {            return matrix[i][j];        }        matrix[i][j] = dp(matrix, s, i + 1, j) + 1;        for (int k = i + 1; k <= j; k++) {            if (s[i] == s[k]) {                matrix[i][j] = min(matrix[i][j], dp(matrix, s, i, k - 1) + dp(matrix, s, k + 1, j));            }        }        return matrix[i][j];    }};int main() {    string s;    cin >> s;    Solution so;    cout << so.strangePrinter(s) << endl;    return 0;}

Conclude

对于动态规划问题,最重要的考虑的就是寻找状态转移方程,而状态转移方程又来自于子问题的分析。也就是需要把一个大问题分解为若干个子问题,每个子问题都可以有解,并且子问题的解又来自其他子问题的解。