474. 1とゼロの合計646.最長のペアのチェーン

今日は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番目の質問です。配列を並べ替える必要があります。あ、寝る

元の記事を17件公開しました 賞賛されました0 訪問数149

おすすめ

転載: blog.csdn.net/qq_33286699/article/details/105131565