小结:动态规划

概要:

状态、转移;最优子结构、无后效性。

技巧及注意:

dp就是纯经验+智商题

在dp方程写出来后,一定要考虑边界!不要以为转移对了就行了!

滚动数组的话一定要考虑好顺序!

下标有时候可以灵活使用!比如mod意义下的dp,倍数什么、可到达性等题目都可以这样做。

如果是线性序列的max{f[k]},k<i这种可以用线段树或bit维护成log

注意“前i”和“第i”的区别(特别对于答案更新),有时换一种就能解答出问题。

在状态加限制条件,如单调、地址等。

用下标来维护下标这个答案是否可达。

博弈论dp可以设当前最优然后后手就是sum-这个前个状态。

与上一个状态或下一个状态有关,可以开一维或多维来维护上个状态或下个状态的信息。

例题:

线性dp:最长公共上升子序列(不要看我自己的解释QAQ),LIS+LCS+LCIS【BZOJ】1003: [ZJOI2006]物流运输trans(SPFA+DP)【BZOJ】3039: 玉蟾宫(DP/单调栈)【wikioi】1403 新三国争霸(dp+kruskal)【BZOJ】1600: [Usaco2008 Oct]建造栅栏(dp)【BZOJ】1613: [Usaco2007 Jan]Running贝茜的晨练计划(dp)【BZOJ】1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛(dp/-bfs)【BZOJ】1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛(lis)(主要是lower_bound),【BZOJ】1642: [Usaco2007 Nov]Milking Time 挤奶时间(dp)【BZOJ】1643: [Usaco2007 Oct]Bessie‘s Secret Pasture 贝茜的秘密草坪(dp)【BZOJ】1638: [Usaco2007 Mar]Cow Traffic 奶牛交通(dfs+dp)【BZOJ】1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典(dp)【BZOJ】1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚(dp/线段树)(数据结构进入dp维护),【BZOJ】1652: [Usaco2006 Feb]Treats for the Cows(dp)【BZOJ】1664: [Usaco2006 Open]County Fair Events 参加节日庆祝(线段树+dp)【BZOJ】1630: [Usaco2007 Demo]Ant Counting(裸dp/dp/生成函数)【BZOJ】3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队(dp)【BZOJ】2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(dp)【BZOJ】2017: [Usaco2009 Nov]硬币游戏(dp+神题+博弈论)【BZOJ】3315: [Usaco2013 Nov]Pogo-Cow(dp)

背包dp:背包模版【BZOJ】1618: [Usaco2008 Nov]Buying Hay 购买干草(dp)【BZOJ】1677: [Usaco2005 Jan]Sumsets 求和(dp/规律)【BZOJ】1649: [Usaco2006 Dec]Cow Roller Coaster(dp)【BZOJ】1673: [Usaco2005 Dec]Scales 天平(dfs背包)【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)

环形dp:拆成3部分(或两部分)线性dp即可。

树形dp:【wikioi】1029 遍历问题【BZOJ】1040: [ZJOI2008]骑士(环套树dp)

状压dp:【BZOJ】1087: [SCOI2005]互不侵犯King(状压dp)【wikioi】2800 送外卖(状压dp+floyd)

数位dp:【BZOJ】1662: [Usaco2006 Nov]Round Numbers 圆环数(数位dp)

时间: 2024-08-10 09:24:06

小结:动态规划的相关文章

动态规划算法分析与探究

动态规划算法分析与探究   摘 要:动态规划是运筹学的一个分支.它是解决多阶段决策过程最优化问题的一种方法.动态规划就是为了使产生决策序列在符合某种条件下达到最优.动态规划思想在各类信息学中频繁的使用,其作用越来越受到人们的重视.本文就动态规划算法进行分析与探究,从而解决实际生活中的诸多问题. 引言   算法是解决一系列问题的清晰指令,能够在有限的时间内获得所要求的输出.一个好的算法对于解决一个或者一类实际问题将给予很大帮助.评价一个算法优劣,主要体现在两个方面(排除错误算法的情况).一.时间优

动态规划之矩阵链乘法

矩阵链相乘 矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An ?两个矩阵A和B只有相容(compatible),即A的列数等于B的行数时,才能相乘.如果A是p×q的矩阵,B是q×r的矩阵,那么乘积C是p×r的矩阵.计算C所需要时间由第8行的标量乘法的次数决定的,即pqr. ? ?以矩阵链<A1,A2,A3>为例,来说明不同的加括号方式会导致不同的计算代价.假设三个矩阵的

leetcode笔记:Coin Change

一. 题目描述 You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of th

leetcode笔记:Perfect Squares

一. 题目描述 Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n. For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9. 二. 题目分析 该题目的大意是

leetcode笔记:Word Break

一. 题目描写叙述 Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s = "leetcode", dict = ["leet", "code"]. Return tr

LA 2038 战略游戏(树的动态规划基础题/无根树转有根树/树的最大最小结点集)

题目大意就是求树的最小结点集,树上的动态规划基础题,一次深搜就可以解决问题 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #i

动态规划专题小结:四边形不等式优化

今天第一次学习四边形不等式优化dp,感觉优化效果十分给力,不过数学味道比较浓重,证明比较复杂.因此这里删繁就简,给出关于四边形不等式优化必须要明白的地方,以后直接套用条件即可. 四边形不等式优化条件 在动态规划中,经常遇到形如下式的转台转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某个最优值.w(i,j)表示在转移时需要额外付出的代价.该方程的时间复杂度为O(N^3). 下面我们通

动态规划专题小结:最长上升子序列(LIS)问题

(1)问题描述:给定n个整数A1,A2,A3...An.按照从左往右的顺序选择尽可能多的整数,组成一个上升子序列,其中相邻元素不能相等. (2)解题思路:本题就是经典的最长上升子序列问题(Longest Increasing Subsequence,LIS).可以通过动态规划解决.定义状态d(i)表示以下标i结尾的LIS的最大长度.那么不难得到如下状态转移方程: d(i)=max{0,d(j)|j<i,Aj<Ai}+1; 最终的答案为max{d(i)}.时间复杂度为O(N^2).由于这种方法十

动态规划小结——背包问题

背包问题是动态规划的经典问题,所有初次学习动态规划都会讲述这个经典问题.因此,有必要弄清跟背包问题的所有分析过程并熟练掌握各种类型的代码. 一,完全背包问题 1.问题描述:有n种物品,每种物品有无限多个,第i个物品重量是wi,价值是vi,从这些物品中挑选总重量不超过W的物品,求出挑选物品价值的最大值. 限制条件:1≤n≤100,1≤wi,vi≤100,1≤W≤10000 2.解题思路:本题类似于"硬币问题",硬币问题只要求凑够相应的面值,这里只不过多了一个新的属性--价值,即不仅要凑够

动态规划小结

动态规划[dp]是解决问题很经典的算法.基本的思想,就是将一个问题转化为若干个子问题,当某个子问题的解已经算出来的时候,就将其记忆存储起来,以便于下次解决同一个子问题时就可以直接给出答案,这样的一个好处就是可以避免重复计算.动态规划适用于有重叠子问题和最优子结构性质的问题,通常能够达到把指数级的时间复杂度下降为多项式时间复杂度的效果. 需要注意的几个点: 需要一个辅助空间,记录子问题的解.而且这种辅助空间一般是三维以下的数组: 需要明确各个子问题之间的关系,以避免重复计算: 一般对数组.字符串等