美文网首页
Java动态规划算法

Java动态规划算法

作者: HelloWide | 来源:发表于2019-03-28 21:51 被阅读0次

个人理解所谓动态规划类似于数学中的归纳演绎,根据小部分数据(n=1,2,3...)开始推测计算公式。
本文提供一种递归方式计算硬币问题的解决方式。
计算公式:d(i) = min(d(i-coin)+1) coin-币值

package com.xxx.test;

import java.util.Arrays;

/**
 * @author :aoyeye
 * @date :Created in 2019/3/21 11:18
 * @description:
 * @modified By:
 */
public class TestList {
    public static void main(String[] args) {
        System.out.println(a_fun(21));
    }
    private static int a_fun(int num) {
        int[] coins = {1, 3, 5};
        int sum = num;
        if (num == 0) {
            return 0;
        }
        for (int coin : coins) {
            if (coin == num) {
                return 1;
            }
            if (num > coin) {
                sum = Math.min(a_fun(num - coin) + 1, sum);
            }
        }
        return sum;
    }
}

类似场景矩阵最短路径计算:

/**
     * 输入:
     * [
     * [1,3,1],
     * [1,5,1],
     * [4,2,1]
     * ]
     * 输出: 7
     * 解释: 因为路径 1→3→1→1→1 的总和最小
     * 说明:每次只能向下或者向右移动一步
     *  m = grid.length
     *  n = grid[0].length
     */
private static int calculate(int m, int n, int[][] grid) {
        int result = 0;

        if (m == 1) {
            for (int i = 0; i < n; i++) {
                result += grid[0][i];
            }
            return result;
        }
        if (n == 1) {
            for (int i = 0; i < m; i++) {
                result += grid[i][0];
            }
            return result;
        }

        result = Math.min(calculate(m - 1, n, grid), calculate(m, n - 1, grid)) + grid[m - 1][n - 1];
        return result;
    }

leetcode上使用递归方式解决提示超时,因此看了网友提供的直接循环遍历,将每一步结果都存入sum[][]中,整体思想一致

public static int minPathSum(int[][] grid) {
        int[][] sum = new int[grid.length][grid[0].length];
        sum[0][0] = grid[0][0];
        for (int i = 1; i < grid[0].length; i++) {
            sum[0][i] = sum[0][i - 1] + grid[0][i];
        }
        for (int j = 1; j < grid.length; j++) {
            sum[j][0] = sum[j - 1][0] + grid[j][0];
        }

        for (int i = 1; i < grid.length; i++) {
            for (int j = 1; j < grid[0].length; j++) {
                sum[i][j] = Math.min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j];
            }
        }
        return sum[grid.length - 1][grid[0].length - 1];
//       递归方式解决,超时
//        int m = grid.length;
//        if (m == 0) {
//            return 0;
//        }
//        int n = grid[0].length;
//        if (n == 0) {
//            return 0;
//        }
//        return calculate(m, n, grid);
    }

相关文章

  • 2019-11-04 回溯算法

    package others; import java.util.Arrays; /** 动态规划算法计算10个工...

  • Java动态规划算法

    个人理解所谓动态规划类似于数学中的归纳演绎,根据小部分数据(n=1,2,3...)开始推测计算公式。本文提供一种递...

  • Java使用动态规划算法思想解决01背包问题

    Java使用动态规划算法思想解决背包问题 背包问题是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种...

  • 动态规划算法

    动态规划算法 最长上升子序列

  • 海红传

    潘寐者,字海红,安庆人氏也。海红生五年,未尝识书具,忽啼求之。父异焉,借旁近与之,即动态规划算法,并以JAVA实现...

  • 维特比算法

    维特比(Viterbi)算法是一种动态规划算法,在处理隐马尔可夫(HMM)最优路径问题时经常被使用. 动态规划算法...

  • 最短路径解决方法

    Floyd算法;Dijkstra算法;Bellman-Ford算法;动态规划算法

  • 背包问题

    介绍 学习动态规划算法的经典例题。动态规划算法一般有3个特征1、最优化原理:最优解所包含的子问题的解也是最优的。2...

  • 动态规划算法(01背包问题)

    一. 动态规划算法介绍: 动态规划算法和分治算法类似,也是将待求解问题分成若干个小问题一步步求解,不同的是,每一个...

  • 基础算法

    二分查找 冒泡排序(优化) 归并排序 动态规划算法

网友评论

      本文标题:Java动态规划算法

      本文链接:https://www.haomeiwen.com/subject/zfrhbqtx.html