-474テーマ動的プログラミング(DP)のLeetcode。ゼロ(1と0)

-474テーマ動的プログラミング(DP)のLeetcode。ゼロ(1と0)


 

コンピュータ業界では、我々は常に限られたリソースで最大の利益を得よう。

さて、あなたはM支配したと仮定  0 し、n個  1さらに、一つだけ含まれている  0 と、  1 文字列配列。

あなたの仕事はメートルで与えられ  0 、nは数  1 、文字列の最大数は、アレイ内に存在綴るできます。各  0 そして  1 ほとんどが一度使用されています。

注意:

  1. 考える  0 と  1 数が超えることはありません  100
  2. 与えられた文字列の長さは配列を超えてはなりません  600

例1:

入力:配列= { "10"、 "0001"、 "111001"、 "1"、 "0"}、M = 5、N = 3 
出力:4 

説明:4の合計によって列と3 5 0呪文1、即ち、 "10"、 "0001"、 "1"、 "0"

例2:

入力:配列= { "10"、 "0"、 "1"}、M = 1、N = 1 
出力:2 

説明: "10"を綴ることができ、その後ない残りの図面がありません。より良いオプションは、「0」と「1」を綴ることです


DP [i] [j]はi番目とj番目の0〜1の最大数を表します。
状態遷移式:
DP [I] [J] = MAX(DP [I]、[J]、DP [ゼロのI-数] [J-数] + 1)。

クラスソリューション{
     公共 のint findMaxForm(文字列[] STRS、int型 M、int型のn){
         int型のlen = strs.length。
        もし(LEN == 0)の戻り 0 ; 

        INT [] [] DP = 新しい INT [M + 1] [N + 1 ]。
        (文字列str:STRS){
             int型 NUM0 = getZero(STR)。
            INT NUM1 = str.length() - NUM0。


            INT ; I> = NUM0; I = M i-- ){
                 ためINTJ = N; J> = num1を。j-- ){ 
                    DP [I] [J] = Math.max(DP [I]、[J]、DP [I-NUM0] [J-NUM1] +1 )。
                } 
            } 
        } 
        戻りDP [M] [N]。
    } 
    公共 INT getZero(文字列str){
         int型 RES = 0 以下のためにint型 i = 0; iが(str.lengthを<); iが++ ){
             場合(str.charAt(I)== '0' ){ 
                RES ++ 
            } 
        } 
        戻りRES。
    } 
}

 

おすすめ

転載: www.cnblogs.com/qinyuguan/p/11495013.html