经典的动态规划

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

时间: 2024-08-02 12:00:03

经典的动态规划的相关文章

【经典】动态规划

五道经典动态规划问题1)最大子序列和题目描述:一个序列,选和最大的子序列转移方程:sum[i]=max{sum[i-1]+a[i],a[i]}当前元素的状态是:自己单独一组还是并到前面最后的答案max{sum[i]}扩展到二维:最大子矩阵方法一:而为前缀和 取maxsum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]方法二:二维RMQ方法三:记录每列的前缀和,枚举子矩阵的上下边界2)最大修改子序列题目描述:一个序列,可以修改一次,假设a[

经典中的经典算法 动态规划(详细解释,从入门到实践,逐步讲解)

动态规划的重要性就不多说,直接进入正题 首先,我们看一下官方定义: 定义: 动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决. 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解.依次解决各子问题,最后一个子问题就是初始问题的解. 基本思想与策略编

《算法竞赛入门经典》动态规划复习

codevs 4979 数塔 1 #define N 100 2 #include<iostream> 3 using namespace std; 4 #include<cstdio> 5 int a[N][N],b[N][N],n; 6 int main() 7 { 8 scanf("%d",&n); 9 for(int i=1;i<=n;++i) 10 for(int j=1;j<=i;++j) 11 { 12 scanf("

nyist oj 17 单调递增最长子序列 (动态规划经典题)

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 来源 经典题目 动态规划的经典题目:好像还有好几种解法,我现在研究的

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

动态规划(DP)概述: 动态规划是运筹学的一个分支.(运筹学,是现代管理学的一门重要专业基础课.该学科利用统计学.数学模型和算法等方法,去寻找复杂问题中的最佳或近似最佳的解答.) 以局部最优解最终求得全局最优解.在设计动态规划算法时,需要确认原问题与子问题.动态规划状态.边界状态结值.状态转移方程等关键要素. 在算法面试中,动态规划是最常考察的题型之一,大多数面试官都以是否可较好地解决动态规划相关问题来区分候选者是否“聪明”. 下面就让我们开始8道经典的动态规划相关题目吧!! 1.LeetCod

硬币找零问题之动态规划

今天我们看一下动态规划的硬币找零问题,主要通过一系列编程题分析动态规划的规律,只要掌握这一规律,许多动态规划的相关问题都可以类比得到. 题目1:给定数组arr,arr中所有的值都是正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 举例: arr[5,2,3],aim=20.  4张5元可以组成20元,其他的找钱方案都要使用更多张的货币,所以返回4. 题解: 一眼看去这道题好像可以用贪心算法可解,但是仔细分析发现有

数据结构-图-经典算法(三)

参考资料 http://www.cnblogs.com/hanchan/archive/2009/09/23/1572509.html http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html http://www.cnblogs.com/RootJie/archive/2012/05/15/2501317.html 四.最短路径 1.从某个源点到其余各个顶点的最短路径 Dijkstra(迪杰斯特拉)算法是典型的单源最短

动态规划--重拾我的“背包”

前言: 背包问题所涉及的是经典的动态规划算法.因为长时间不AC了,渐渐感觉思维也都麻了!本文将基础的背包问题做个小结,方便以后翻阅.感兴趣的朋友也可以阅读一下~------------------------(1)如何从n个重量和价值分别为Vi.Wi的物品中选择一或多个放入最大容纳量为S的背包使其总价值最大? 输入: 5 10   (分别表示:n,S)2 37 53 15 102 2 5 62 37 53 15 102 2 输出: 15 10 分析: f[i][j]:表示背包在存放了前i件物品占

动态规划:数塔问题

动态规划问题我训练过一些题目,但是感觉自己掌握的还不是特别好! 下面以一道经典的动态规划题目说明动态规划算法的思想,文末会官方的给出对动态规划的文字叙述. 先看题目:如下图(图片来自百度图片)是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大. 思路分析: 这道题目如果使用贪婪算法不能保证找到真正的最大和. 在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算. 从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还