动态规划-扔鸡蛋

动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果

动态规划算法与分治法类似,其基本思想就是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复结算了很多次。如果我们能够保存已经解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,从而得到多项式时间复杂度的算法。为了达到次目的,可以用一个表来记录所有已解决的子问题的答案,不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划的基本思想。

你看了肯定没有抓住重点,那就多读几遍,不过下面早已备好:

1.将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解;
2.经分解得到的子问题往往不是相互独立的;
3.保存已经解决的子问题的答案,避免重复计算。

基本要素:
1.最优子结构性质:当问题的最优解包含子问题的最优解的时候,称该问题具有最优子结构性质。
2.无后效性:将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。
3.子问题的重叠性:动态规划算法的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间

/*
* 有一栋从1层到N层共计N层的楼,然后有K个鸡蛋,K至少为1.现在确定这栋楼确定一个楼层0<=F<=N,
* 在这层扔鸡蛋恰好不会摔碎,高于F层扔鸡蛋都会碎,低于的则不会碎,未摔碎的鸡蛋则可以继续使用,
* 摔碎了则不能再继续使用。求在最坏的情况下,至少扔多少次才能确定这个楼层F
* */
//扔鸡蛋问题
public class P2 {
    public static void main(String[] args) {
        System.out.println(getDP(200,100));
    }
    private static int getDP(int K,int N) {
//        因为有K个鸡蛋,N层楼梯,所以创建二维数组
        int[][] dp = new int[K+1][N+1];
//        从鸡蛋个数开始遍历
        for (int i = 1; i < K + 1; i++) {
//            楼层开始遍历
            for (int j = 1; j < N + 1; j++) {
//                如果鸡蛋数目为1,则最坏情况需要扔j次
                if (i == 1) {
                    dp[i][j] = j;
                } else {
                    int res = Integer.MAX_VALUE;
                    for (int x = 1; x < j + 1; x++) {
                        res = res < ((dp[i - 1][x - 1]>dp[i][j - x]?dp[i - 1][x - 1]:dp[i][j - x]) + 1)?res:((dp[i - 1][x - 1]>dp[i][j - x]?dp[i - 1][x - 1]:dp[i][j - x]) + 1);
                    }
                    dp[i][j] = res;
                }
            }
        }

        return dp[K][N];
    }
}

你可能感兴趣的:(动态规划-扔鸡蛋)