-474テーマ動的プログラミング(DP)のLeetcode。ゼロ(1と0)
コンピュータ業界では、我々は常に限られたリソースで最大の利益を得よう。
さて、あなたはM支配したと仮定 0
し、n個 1
。さらに、一つだけ含まれている 0
と、 1
文字列配列。
あなたの仕事はメートルで与えられ 0
、nは数 1
、文字列の最大数は、アレイ内に存在綴るできます。各 0
そして 1
ほとんどが一度使用されています。
注意:
- 考える
0
と1
数が超えることはありません100
。 - 与えられた文字列の長さは配列を超えてはなりません
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。 } }