474. 一和零 和 646. 最长数对链

今天做了3道题,有一道很简单就没列出来,这两个是我对于动态规划更加完整性的理解的题目,我们将题目列出来:

这道题乍一看,数组之间没有什么特定的规律,也不是去寻找数组之间的规律,动态规划能不能使用呢,但是我们看到总数mn,和消耗ij,我们可以很轻松的总结出dp[i][j]=dp[m-字符中0数量][n-字符中1数量]+1 与dp[i][j]之间的最大值。也就是相当于我们把所有的dp数组都更新一遍,这和01背包问题特别的像,我们开始只有一个字符串,那么更新,有两个字符串,那么更新等等等等,下面我们列出代码:

    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;
    }

 第二题呢,比第一题绕的弯子少的多,列出题干:

看了题目,我们想到就是遍历一下在选定数组之前dp数组的最大值+1,这道题还是比较简单的,我们直接列出代码:

        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;
    }

需要注意的点,就是第二题,我们需要将数组进行重新排序。噢啦 睡觉去咯

发布了17 篇原创文章 · 获赞 0 · 访问量 149

猜你喜欢

转载自blog.csdn.net/qq_33286699/article/details/105131565