有一个动态规划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.....