leetcode 644奇妙なプリンタ

そこに奇妙であり、特殊なプリンターは、次の2つの要件があります。
プリンタは唯一と文字の列を印刷することができます。
たびに新しい文字は任意の開始と終了の位置に印刷することができ、既存の元の文字が上書きされます。
小文字の文字列のみが含まれて考えると、あなたのタスクは、それが必要とするプリンタの最小数を計算することです。
出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/strange-printer

アイデア:
1.最初の間隔これは、動的プログラミングで
2.F [I] [j]はIから少なくとも印刷のj個の閉区間表す
1は、我々は、プロセスFを分離することができる基本ケースであるため、最初から3列挙間隔を[I] [I] = 1
要素1の複数の、我々が追加された2つのセル間のKに分けることができるときにインターバルの開始から4 2は、間隔が音符があり、以前よりも高くなります特別な場合、新しい受信端要素および要素は、次に等しい場合、F [i]は[J] = F [I + 1]〜[J] またはF [I] [J-1 ]

class Solution {
public:
    int strangePrinter(string s) {
        if(!s.size())return 0;
        vector<vector<int>> f(s.size()+1,vector<int>(s.size()+1,1e9));
        for(int i=0;i<s.size();++i)f[i][i]=1;
        for(int len=2;len<=s.size();++len){
            for(int i=0;i+len-1<s.size();++i){
                int j=i+len-1;
                if(s[i]==s[j])f[i][j]=f[i+1][j];
                else if(s[j]==s[j-1])f[i][j]=f[i][j-1];
                else{
                    for(int k=i;k<j;++k){
                        f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
                    }
                }
            }
        }
        return f[0][s.size()-1];
    }
};

おすすめ

転載: www.cnblogs.com/clear-love/p/11455055.html