动态规划算法

一,动态规划算法的思想

将待求解的问题分成若干个子问题,先求解子问题,然后从子问题中得到原问题的最优解。与分治算法不同的是,适合用于动态规划算法求解的问题,经分解得到的子问题往往不是互相独立的。如果使用分治算法求解,有些子问题被重复计算了很多次。为了避免这个问题,可以使用一张表记录所有已解决的子问题的答案,在需要时直接从表中找到已求解的答案,这就是动态规划算法的基本思想。


二,动态规划算法的基本要素

适用于动态规划算法求解的问题,具有两个重要的性质

1,最优子结构

当问题的最优解包含于其子问题的最优解时,称该问题具有最优子结构性质。在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解,逐步构造出整个问题的最优解。


2,子问题重叠

在使用递归算法自顶向下求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算过多次。动态规划正是利用了这种子问题的重叠性质,对每一个子问题只求解一次,而后将求得的解放在表中,当再次需要解决此子问题时,只是简单的从表中查看一下结果。


三,常见的使用动态规划求解的问题

1,最大子段和

int maxSum(vector<int> &nums){
    if(nums.size() == 0){
        return -1;
    }
    //当前最大子段和
    int sum = nums[0];
    //最大子段和
    int bestSum = (nums[0] > 0) ? nums[0] : -1;
    for(int i = 1; i < nums.size(); i ++){
        if(sum > 0){
            sum += nums[i];
        } else {
            sum = nums[i];
        }
        if(sum > bestSum){
            bestSum = sum;
        }
    }
    return bestSum;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值