经典的动态规划

Posted 小时のblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典的动态规划相关的知识,希望对你有一定的参考价值。

有一个动态规划100例...看到机房里shenben的复习资料...加上垃圾的dp....整理一下。

一、资源分配问题

tyvj 1203 机器分配

题目大意:有m个设备,n个公司,v[i][j]表示第i个公司分j个设备的贡献值。怎样分配使贡献值的和最大?

状态:前i个公司分j个设备。

f[i][j]表示前i个公司分j个设备,枚举第i个公司分k个设备。

状态转移方程:f[i][j]=max{f[i-1][j-k]+v[i][k]}

这个还挺简单的。

洛谷P2736 “破锣摇滚”乐队 Raucous Rockers

题目大意:有n首歌曲和m个唱片,每首歌的时长为tim[i],每个唱片能容纳歌曲的时间为t,并且还要

按顺序将歌曲放入唱片中,即第i个唱片的最后一首歌曲比第i+1个唱片的第一个歌曲发行的时间早。

这个题做法很多。

状态:状态是对于每一个歌曲来的,当前的这首歌曲有三个状态,不加入任何一个唱片,加入当前唱片,

加入一个新的唱片。

题解:方法一  dfs搜每个状态就可以了,有一个剪枝,当把剩下的歌曲都加入唱片中仍比答案小时return.

我一开始dfs传的参数为唱片,装完第一个再装第二个...好混乱..是我zz。方法二:01背包 dp[k][j]前k个唱片

第k个唱片时间为j时能放的歌曲数。dp[k][j]=max{dp[k-1][t],dp[k][j-tim[k]] }+1.放入前一个唱片和当前唱片。

洛谷P2530 [SHOI2001]化工厂装箱员

题目大意:有一堆物品,每次按顺序取前十个,不够十个全都取。物品只有A,B,C三种,每次可以将当前手中所拥有

十个物品中的A或者B或者C清0,每次操作后需要按顺序再哪物品,满足手中有10个物品。问最少需要几次操作可以使

物品清完。

状态:从一堆物品中拿了s个,目前手中有a个A,b个B,c个C的方案数。

转移方程:用的记忆化搜索 dp[s][a][b][c]=min{dp[s][0][b][c],dp[s][a][0][c],dp[s][a][b][0]}+1

二、线性动态规划

codevs 1576最长严格上升子序列

状态:以a[i]结尾的最长严格上升子序列的最大长度

转移方程:dp[i]=max{dp[i],dp[j]+1}其中j<i且a[j]<a[i],dp[i]表示以a[i]结尾的最长长度,初始值为1,只有它自己。

codevs 3049 舞蹈家怀特先生

题目大意:先生跳舞跳n次,每次跳的位置是a[i],(1,2,3,4),开始在0,从a跳到b的代价是不一样的,且左右脚不能在

一个位置,求最小的价值。

状态:发现我们需要记录的状态是怀特先生跳到第几次,左脚和右脚的位置分别是什么。

转移方程:f[i][a[i]][k]=min{f[i-1][l][k]},f[i][j][a[i]]=min{f[i-1][j][r]}

NYOJ 110 剑客决斗

题目大意:有n个人,每个人可以与他的右边的人决斗,败者出局,且战斗力没有传递性。决斗的顺序不同最终的胜者就不同。

问不同的决斗顺序最后可以胜利的人有多少个。

题解:区间 dp断链成环。不要考虑谁和谁决斗,胜还是败,只要最后他能和自己决斗就说明就剩下他一个人了。

转移方程类似于floyed。

waiting.....

 

以上是关于经典的动态规划的主要内容,如果未能解决你的问题,请参考以下文章

豁然开朗经典算法之动态规划

动态规划(Dynamic Programming)LeetCode经典题目

经典动态规划——从LeetCode题海中总结常见套路

经典算法研究系列 之 动态规划算法

动态规划经典教程

单序列与双序列动态规划经典题解