zoukankan      html  css  js  c++  java
  • 经典的动态规划

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

  • 相关阅读:
    nginx缓存
    java 常用命令工具
    shell流程控制--循环语句
    Python 文档 涉及词汇
    python 学习网站
    python web入门程序
    编译安装 Python3.6.1
    正则表达式与grep
    编译安装 Nginx1.12.1
    查看进程号
  • 原文地址:https://www.cnblogs.com/zzyh/p/7575566.html
Copyright © 2011-2022 走看看