动态规划问题(C++版本)

25人阅读 评论(0) 收藏 举报
分类:

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。

本文将通过几个例子来逐步向大家介绍动态规划。

首先应用动态规划区去解决问题是有条件的:1求最优化问题;2可以将问题拆解成小问题。

例1. LeetCode 121 Best Time to Buy and Sell Stock

题目解读:有一组数表示某支股票每天的价格,找到最大收益。应用动态规划来解决这个问题我们首先要看看是不是满足那两个条件:1本题是求最优解的;2如何拆解成小问题?

大问题是求最大收益,那么小问题可以写成遍历股票价格,比较当前时刻卖出的话可以获得的最大收益是多少!

通过这个解释可以看到把大问题拆解成小问题也是有要求的:小问题和大问题的性质需要保持一致,而且求解小问题的最终目标是得到大问题的解。所以求当前时刻卖出股票可以得到的最大收益,到最后一天的时候就得到这个大问题的解。

class Solution {
public:
int maxProfit(vector<int> &prices) {
int maxPro = 0;
int minPrice = INT_MAX;
for(int i = 0; i < prices.size(); i++){
minPrice = min(minPrice, prices[i]);//保存在遍历的过程价格最小值
maxPro = max(maxPro, prices[i] - minPrice);//保存遍历的过程中收益最大值
}
return maxPro;
}
};

这个问题非常简单,用动态规划的思路来解答这个问题可以对动态规划有个简单的认识。

 例2. LeetCode 746 Min Cost Climbing Stairs

 题目解读:这是一个爬楼梯的题目,你一步可以爬一个台阶或者两个台阶,每个台阶都是收费的,你需要支付这个费用才能从这个台阶往上爬。爬到顶点的最低费用是多少?

 这个问题同样是求最优解的问题,看看这个问题拆解成小问题是怎样的?

 这个问题是求到达顶点的最低费用,那么小问题就是到达每个台阶且从该台阶往上爬的最低费用。那么到了顶点之后只需要看一下倒数第一和倒数第二两个台阶往上爬的费用即可比较出到达顶点的最低费用。

 怎么得到到达每个台阶且从该台阶往上爬的最低费用?

    dp[i]=cost[i]+min(dp[i-1],dp[i-2])

class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=(int)cost.size();
vector<int> dp(n);
dp[0]=cost[0];
dp[1]=cost[1];
for (int i=2; i<n; ++i)
dp[i]=cost[i]+min(dp[i-2],dp[i-1]);
return min(dp[n-2],dp[n-1]);
}
};

这个例子相比与例1稍微难一点,但是用动态规划的思路去解也是非常简单的。

 例3. 01背包问题

 这里贴一个参考的文章:https://blog.csdn.net/mu399/article/details/7722810

 01背包问题是非常经典的问题,也是动态规划的代表问题。这里我就不多解释了,参考文章里讲的非常好。


查看评论

【算法笔记】动态规划,三个例题(解题思路与C++代码)

这个笔记参考了《算法导论》第二版和第三版两版里,关于动态规划的基本模型范例:“装配线调度”,“切割钢条”,再加上一个比较简单的ACM入门题“拦截导弹”,来分析一下动态规划的具体内容。 从个...
  • shihoongbo
  • shihoongbo
  • 2016年04月18日 23:43
  • 2705

动态规划四个经典问题的c++实现

  • 2015年06月22日 10:23
  • 4KB
  • 下载

动态规划的简要总结和四个经典问题的c++实现

本文给出了动态规划的简要定义、适用场景、算法实现。并给出了四种经典动态规划:钢条切割求最大收益问题、矩阵链相乘求最小乘法次数问题、最长公共子序列问题、求最小的搜索代价的最优二叉搜索树的c++代码实现。...
  • quzhongxin
  • quzhongxin
  • 2015年06月22日 10:28
  • 4670

动态规划算法——C++实现经典案例——初级

从简到繁,从易到难,循序渐进。切近亲力亲为,动手写代码。 动态规划的详细知识点请参考:http://blog.csdn.net/misayaaaaa/article/details/7179...
  • misayaaaaa
  • misayaaaaa
  • 2017年05月15日 10:04
  • 1714

动态规划与钢条切割问题 C++实现

动态规划一、原理我们可以用拉格朗日乘数法,求解给定条件下的方程最优解,同样,动态规划算法也是用于在一定条件下的求解最优解的方法。它和分治方法很相似,都是通过组合子问题来求解原问题。一般适用于动态规划算...
  • liu798675179
  • liu798675179
  • 2016年11月01日 19:50
  • 860

动态规划--凑硬币 C++实现

/* * File name : dp_coin.cpp * Function : 动态规划--凑硬币 C++实现 * Created on : 2016年6月28日 * Author ...
  • beijiwei
  • beijiwei
  • 2016年06月28日 10:20
  • 516

C++动态规划解决矩阵连乘问题

#include #include using namespace std; fun(int l,int n,int m[]) { int i,j,k,r; int **a = new int*...
  • u014520745
  • u014520745
  • 2014年11月13日 15:39
  • 1549

动态规划NM---滑雪问题

滑雪问题: 高--->低,求滑行最长距离 input:第一行表示区域的行数R和列数C(1 output:求出最长区域的长度; sample input: 5 5 1 2 3 4 5...
  • qq978874169
  • qq978874169
  • 2015年04月14日 00:02
  • 513

算法:C++实现动态规划中的几个典型问题

动态规划的思想在程序设计中占有相当的分量,动态规划的主要思想就是把大问题划分为小问题,通过求解小问题来逐渐解决大问题。 满足动态规划思想的问题具备两个典型特征: 最优子结构:就是说局部的最优解能...
  • u010558281
  • u010558281
  • 2017年07月31日 18:49
  • 802

经典动态规划问题--数字三角形 POJ--1163

经典动态规划问题--数字三角形 POJ--1163
  • linsheng9731
  • linsheng9731
  • 2014年04月16日 13:38
  • 1541
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 5万+
    积分: 1440
    排名: 3万+
    博客专栏
    最新评论