今日は3つの質問をしましたが、そのうちの1つは非常に単純ですがリストされていません。これらの2つは、動的プログラミングについてより完全に理解している質問です。次の質問をリストします。
この質問は、一見すると、配列間に特定の法則はなく、配列間の法則を見つけることも、動的計画法を使用することもできますが、合計数mnと消費ijを見ると、簡単に要約できます。 dp [i] [j] = dp [0-m文字の数] [1-n文字の数] +1とdp [i] [j]の間の最大値が与えられます。これは、すべてのdp配列を更新することと同じです。これは、01バックパックの問題に特に類似しています。1つの文字列のみから始め、次に更新し、2つの文字列があり、次に更新などを行います。コード:
public int findMaxForm(String[] strs, int m, int n) {
if(strs.length==0) return 0;
int[][] dp=new int[m+1][n+1];
for(String s:strs){
int[] ints=getInt(s);
for(int i=m;i>=ints[0];i--){
for(int j=n;j>=ints[1];j--){
dp[i][j]=Math.max(dp[i][j],1+dp[i-ints[0]][j-ints[1]]);
}
}
}
int res=0;
for(int i=0;i<dp.length;i++){
for(int j=0;j<dp[0].length;j++){
res=Math.max(res,dp[i][j]);
}
}
return res;
}
public int[] getInt(String s){
int[] ints=new int[2];
for (char c:s.toCharArray()){
ints[c-'0']++;
}
return ints;
}
2番目の質問については、最初の質問の周りの曲がりが少なくなっています。
質問を読んだ後、配列+1を選択する前にdp配列の最大値を反復処理することを考えました。この質問は比較的単純です。コードを直接リストします。
if(pairs.length==1||pairs.length==0) return 0;
int []dp=new int[pairs.length];
Arrays.sort(pairs, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
Arrays.fill(dp,1);
for(int i=1;i<pairs.length;i++){
for(int j=0;j<i;j++){
if(pairs[i][0]>pairs[j][1]){
dp[i]=Math.max(dp[j]+1,dp[i]);
}
}
}
int res=0;
for(int i:dp){
res=Math.max(i,res);
}
return res;
}
注意すべき点は、2番目の質問です。配列を並べ替える必要があります。あ、寝る