动态规划算法题

42 阅读1分钟

1. 最小路径


[ [2], [3,4], [6,1,8] ] minPath=2+3+1


 public int minimumTotal(List<List<Integer>> triangle){
        for (int i = triangle.size()-2; i >=0 ; --i) {
            for (int j = 0; j <i+1 ; j++) {
                int old=triangle.get(i).get(j);
                triangle.get(i).set(j, old+Math.min(triangle.get(i+1).get(j),triangle.get(i+1).get(j+1)));
            }
        }
        return triangle.get(0).get(0);
}

2.最大连续子数组


[−2,1,−3,4,−1,2,1,−5,4] [4,−1,2,1] sum = 6 .


 public int minimumTotal(List<List<Integer>> triangle){
        for (int i = triangle.size()-2; i >=0 ; --i) {
            for (int j = 0; j <i+1 ; j++) {
                int old=triangle.get(i).get(j);
                triangle.get(i).set(j, old+Math.min(triangle.get(i+1).get(j),triangle.get(i+1).get(j+1)));
            }
        }
        return triangle.get(0).get(0);
}

3.最大连续子数组乘积

    public static int maxProduct(int[] nums){
        int maxLocal=nums[0];
        int minLocal=nums[0];
        int global=nums[0];
        for (int i = 1; i <nums.length ; i++) {
            int tem=maxLocal;
            maxLocal=Math.max(Math.max(nums[i]*maxLocal,nums[i]),nums[i]*minLocal);
            minLocal=Math.min(Math.min(nums[i]*tem,nums[i]),nums[i]*minLocal);
            global=Math.max(global,maxLocal);
        }
        return global;
    }

4.最长连续递增子序列

    public static int lengthOfLIS(int[] nums){
        if(nums==null||nums.length==0)return 0;
        int[] f=new int[nums.length];
        Arrays.fill(f,1);
        int global=1;
        for (int j = 1; j < nums.length; j++) {
            for (int i = 0; i <j ; i++) {
                if(nums[i]<nums[j]){
                    f[j]=Math.max(f[j],f[j]+1);
                }
            }
            global=Math.max(global,f[j]);
        }
        return global;
    }

5.字符串中回文串的最小切割数

 public static int minCut(String s){
        final int n=s.length();
        int[] f=new int[n+1];
        boolean[][] p=new boolean[n][n];
        for (int i = 0; i <n ; i++) {
            for (int j = i; j <n ; j++) {
                if(s.charAt(i)==s.charAt(j)&&(j-i<2||p[i+1][j-1])){
                    p[i][j]=true;
                    f[i]=Math.min(f[i],f[j+1]+1);
                }
            }
        }
        return f[0];
    }