动态规划思想和例题讲解

定义

动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。其思想非常简单,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。

步骤

1.拆分问题
2.找到子问题之间的关系(类似写出推导公式)
3.保留子问题的最优解

例题

看完定义和步骤后,基本不理解,然后根据题来理解:
题目:最大子序和
在这里插入图片描述解法1:暴力法

public class Solution {
    public int MaxSubArray(int[] nums) {
        int max=Int32.MinValue;//定义一个无限小的数
        for(int i=0;i<nums.Length;i++)
        {
            int sum=0;
            for(int j=i;j<nums.Length;j++)
            {
                sum+=nums[j];
                if(sum>max)
                {
                    max=sum;
                }
            }
        }
        return max;
    }
}
执行结果:
-2-1-1001222
22223444
4444444
445666
66666
6666
666
66
6

解法2:动态规划

public class Solution {
    public int MaxSubArray(int[] nums) {
        int ans = nums[0];
        int sum = 0;
        for(int i=0;i<nums.Length;i++) {//**对应步骤1**
            if(sum > 0) {           
                sum += nums[i];
            } else {					//**中间部分对应步骤2**
                sum = nums[i];
            } 
            ans = Math.Max(ans, sum);//**对应上述步骤3**
            Console.WriteLine(ans);
        }
        return ans;
    }
}
执行结果:
-2 
1 
1
4 
4 
5 
6 
6 
6

例题分析

首先对动态规划法进行讲解,然后再对这两种方法进行对比,来看动态规划的优点。
分析:
首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans;
如果 sum > 0,sum 保留并加上当前遍历数字;
如果 sum <= 0,需要舍弃,则 sum 直接更新为当前遍历数字;
每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果。
对比两种方法:
从结果可以看出
暴力法的计算非常复杂,复杂在对后一次循环的计算中,前一次循环已经计算过一次,导致多次重复计算。
而动态规划完美的解决了这个问题:保留了子问题的最优解,避免了重复运算!

动态规划适用场合

1.相互重叠的子问题(例如上面的例子)。
2.最优子结构性质的问题。(点击这里->动态规划案例讲解

欢迎评价和指正!谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值