您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: