dp总结(1)
2016-12-11 21:53
190 查看
******最小m段和问题
代码:http://blog.csdn.net/zyq_19960204/article/details/53575851
题意:给n个数,分成m段,取每段子序列的和的最大值,要求怎么分才能使这个最大值最小
思路:用二维数组dp
[m];(dp[i][j])
i代表着当前扫到第几个元素,j代表了要分成几段
因为大问题总是由小问题推出来的,dp讲究个思路,就是解决问题的策略,只要策略不错,那么小问题一直推到大问题就不会错,那么先考虑分成1段的情况,然后考虑分成2
段的情况,然后继续下去,一直到m段停止,扫描的元素个数也是一个一个增加上去的,现在得找个通用的方法,就是这里的递归状态转移方程式,这个式子必须严格符合小情
况是怎么推向到大情况的,由于元素是一个一个加上去的,而新加上去的元素有可能对现在的结果产生影响,也可能不产生影响,所以要用dp策略去解决判断,是否要对当前的
结果进行改变,那么这时就可以得到一个思路,就是每加上一个元素,我就把它当成一段,与前面的j-1段值进行比较,如果小,就不进行更新,没影响,如果比j-1段的值还要
大,就进行更新,然后去验证,思考是否完美解决问题,如果解决了,那么边界值应该怎么考虑,如果想通了,那么问题就差不多解决了,
方程式:dp[i][j]=min{dp[i][j],max{dp[k][j-1]},dp[i][1]-dp[k][1]};
这里的dp[i][1]-dp[k][1]就代表了从k到i这一段区间的数字被分成1段
******最大k乘积
代码:http://blog.csdn.net/zyq_19960204/article/details/53575865
题意:给出一个值,有n位,然后分成k段(即k个数字),求最大乘积
思路:同样也是二维数组,dp
[m];(dp[i][j])
w[i][j]表示的是i到j这段区间数字的十进制数
策略差不多,数组代表的意义同样是把前i个数字分成j段的最大乘积,
那么同样的道理:dp[i][j]=max{dp[k][j-1]*w[k+1][i]}
这里的w[k+1][i]表示的是从k+1到i这段区间的这一个十进制数字
*****独立任务最优调度
题意:用两台机器处理多个作业,a机器处理需要ai时间,b机器处理需要bi
时间,一台机器字同一时间只能处理一个作业,两台都能处理任何作业,问
完成这些作业最短需要多长时间。
思路:现在有三种变量,一个是第几个物品,一个是处理到第i个物品时,a机器
的处理状态,还有一个是b机器的处理状态,如果用三维,很好处理,每一维代表
一种变量,最后在比较到达第n个物品时,机器a与机器b的状态,选出小的。
代码就不给出了,网上都有;
现在用二维描述,第一维是第几个物品,第二维是a机器的处理状态,然后结果是b机器
的处理状态。dp[i][j]表示扫描到第i个物品时,机器a花费不小于j时间的前提下
,机器b所需完成的最少花费时间;
代码:http://blog.csdn.net/zyq_19960204/article/details/53574123
既然做到了这步,那么现在就有点像背包问题了,那么是否可以转化成为一维的呢?,答案肯定是可以的,去掉二维中的第一维呗。
代码:http://blog.sina.com.cn/s/blog_79b832820100whiq.html
代码:http://blog.csdn.net/zyq_19960204/article/details/53575851
题意:给n个数,分成m段,取每段子序列的和的最大值,要求怎么分才能使这个最大值最小
思路:用二维数组dp
[m];(dp[i][j])
i代表着当前扫到第几个元素,j代表了要分成几段
因为大问题总是由小问题推出来的,dp讲究个思路,就是解决问题的策略,只要策略不错,那么小问题一直推到大问题就不会错,那么先考虑分成1段的情况,然后考虑分成2
段的情况,然后继续下去,一直到m段停止,扫描的元素个数也是一个一个增加上去的,现在得找个通用的方法,就是这里的递归状态转移方程式,这个式子必须严格符合小情
况是怎么推向到大情况的,由于元素是一个一个加上去的,而新加上去的元素有可能对现在的结果产生影响,也可能不产生影响,所以要用dp策略去解决判断,是否要对当前的
结果进行改变,那么这时就可以得到一个思路,就是每加上一个元素,我就把它当成一段,与前面的j-1段值进行比较,如果小,就不进行更新,没影响,如果比j-1段的值还要
大,就进行更新,然后去验证,思考是否完美解决问题,如果解决了,那么边界值应该怎么考虑,如果想通了,那么问题就差不多解决了,
方程式:dp[i][j]=min{dp[i][j],max{dp[k][j-1]},dp[i][1]-dp[k][1]};
这里的dp[i][1]-dp[k][1]就代表了从k到i这一段区间的数字被分成1段
******最大k乘积
代码:http://blog.csdn.net/zyq_19960204/article/details/53575865
题意:给出一个值,有n位,然后分成k段(即k个数字),求最大乘积
思路:同样也是二维数组,dp
[m];(dp[i][j])
w[i][j]表示的是i到j这段区间数字的十进制数
策略差不多,数组代表的意义同样是把前i个数字分成j段的最大乘积,
那么同样的道理:dp[i][j]=max{dp[k][j-1]*w[k+1][i]}
这里的w[k+1][i]表示的是从k+1到i这段区间的这一个十进制数字
*****独立任务最优调度
题意:用两台机器处理多个作业,a机器处理需要ai时间,b机器处理需要bi
时间,一台机器字同一时间只能处理一个作业,两台都能处理任何作业,问
完成这些作业最短需要多长时间。
思路:现在有三种变量,一个是第几个物品,一个是处理到第i个物品时,a机器
的处理状态,还有一个是b机器的处理状态,如果用三维,很好处理,每一维代表
一种变量,最后在比较到达第n个物品时,机器a与机器b的状态,选出小的。
代码就不给出了,网上都有;
现在用二维描述,第一维是第几个物品,第二维是a机器的处理状态,然后结果是b机器
的处理状态。dp[i][j]表示扫描到第i个物品时,机器a花费不小于j时间的前提下
,机器b所需完成的最少花费时间;
代码:http://blog.csdn.net/zyq_19960204/article/details/53574123
既然做到了这步,那么现在就有点像背包问题了,那么是否可以转化成为一维的呢?,答案肯定是可以的,去掉二维中的第一维呗。
代码:http://blog.sina.com.cn/s/blog_79b832820100whiq.html
相关文章推荐
- IT资源关东煮第一期【来源于网络】
- 什么是尾递归
- UW CSE 351: The Hardware/Software Interface 目的及大纲
- 在腾讯云上创建您的SQL Cluster(3)
- 从零开始学Python08作业思路:开发简单的FTP
- 女科学家吴健雄
- Struts
- 关于android在真机调试中出现错误提示:Uninstalling will remove the application data!
- React-native运行异常之一一SyntaxError:Strict mode does not allow function declaration in a lexically nested
- 3399 数据结构实验之排序二:交换排序
- 剑指offer——面试题42:翻转单词顺序VS左旋转字符串
- python-格式化字符串
- 函数和方法
- redis-cluster研究和使用
- Flask小博客与Stormpath结合
- 从零开始学写HTTP服务器(二)socket编程实现简单的http server
- STM32的CAN总线学习总结
- TwinklingRefreshLayout 小而强大的刷新控件,自带顺滑的越界回弹,v1.04 版精心重构,完美发布啦!
- Linux学习笔记7——umask函数
- java- 多态详细解释