简单记录N个动态规划的例子
来源:互联网 发布:nba总决赛个人数据统计 编辑:程序博客网 时间:2024/06/06 01:38
通过最近对于一些算法题的思考,越来越发现动态规划方法的在时间上高效性,往往该问题可以轻松的找到暴力破解的方法,其时间复杂度却不尽人意。下面来看看几个常见的动态规划思路的经典问题
例一.有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?(腾讯电面题之一)
其状态转移方程为:
f(n):表示n阶楼梯有多少种走法
f(n)=f(n−1)+f(n−2)
f(1)=1,f(2)=2
例二:01背包问题
有n个重量和价值分别为vector weight, vector value的物品;背包最大负重为W,求能用背包装下的物品的最大价值?
输入:n =4
weight=2, 1, 3, 2
value =3, 2, 4, 2
W=5
输出=7
dp[i][j]表示前i号物品中能选出重量在j之内的最大价值
dp[i][j]=max(dp[i−1][j],dp[i−1][j−w[i]]+v[i]);
例三:最大连续子序列和
如给定数组[-2,1,-3,4,-1,2,1,-5,4]
连续的子数组为[4,-1,2,1]有最大和6
f(j+1)为以下标j结尾的连续子序列和的最大值
f(j+1)=max(f(j)+A[j],A[j])
target=maxf[j]
思考:最大连续子序列乘积
如给定数组[-2,1,-3,4,-1,2,1,-5,4]
连续的子数组为[4,-1,2,1]有最大和6
f(j+1)为以下标j结尾的连续子序列最大乘积值(1)
状态转移方程如何表示呢:
这里我们知道A[j]可能为正数(或0)或负数,那么当A[j]为正数,期望前j个乘积为正数,若为负数,则期望前面的为负数。故我们需定义两个函数来确定我们的状态转移方程:
fmax(j+1)=max(max(fmax(j)∗A[j],A[j]),fmin(j)∗A[j])
fmin(j+1)=min(min(fmin(j)∗A[j],A[j]),fmax(j)∗A[j])(2)
1.通过以上动态问题问题的分析,可以看出最重要的是定义好相应的问题,然后写出状态转移方程,往往这也是整个问题求解最能考察你分析能力的过程。能够用动态规划求解的问题有两类性质:
a.重叠子问题
采用递推方式,比如上例要求出10阶楼梯走法,那么最后一步是踏一步上来或者踏2步上来,最后转化为相应的子问题,子问题深入求解就包含了重叠的子问题,所以自顶向下的实现并不高效,常采用备忘录方式保存子问题的最优解,自底向上更高效。
b.最优子结构:
往往子问题的最优解可以推出原问题的最优解
- 简单记录N个动态规划的例子
- 一个动态规划例子----n节点的连通图的个数有多少个?
- 动态规划的经典例子
- 动态规划的一个例子
- 动态规划简单例子--象棋步骤
- 动态规划简单例子之硬币数量
- m个工厂分的n个资源,使获得利润最大(动态规划)
- n个骰子个点数和出现的概率- 动态规划
- n个盘子放m个苹果(动态规划)
- 求n个骰子各点数和出现的概率-动态规划
- n个骰子各点数和出现的概率--动态规划
- 求n个骰子各点数和出现的概率-动态规划
- 求n个骰子各点数和出现的概率-动态规划
- 求n个骰子各点数和出现的概率-动态规划
- N个元素的进出栈总数-方法转换-动态规划
- poj1221简单的动态规划
- HDU2084 简单的 动态规划
- 简单版的动态规划
- 操作系统之存储器管理
- 【CodeM初赛A 5】数列互质 题解
- 变量的存储方式和生存期
- Ui设计中单选按钮与复选框详解
- 关于python多线程的爬虫的一些实践
- 简单记录N个动态规划的例子
- 读书笔记-大型网站系统与Java中间件8
- C++ 求两个集合的交集和并集
- Happy Number【202】
- 《linux命令行与shell脚本编程大全》第三版
- tomcat 的配置
- python 初学者的第一天
- 我为什么选择go语言
- CRM工具简介