递推&动态规划
_rhinoceros_
非淡泊无以明志,非宁静无以致远。
展开
-
(背包)[USACO10JAN]Cheese Towers S
一、算法分析完全背包套一个枚举,洛谷的题目翻译好像没说清是完全背包。详解看代码及注释。二、代码及注释#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#define v first#define h secondusing namespace std;//如果有大奶酪,则大奶酪必然在塔顶,因为大奶酪会影响塔中的所有奶酪//且塔顶的其它大奶酪是不是大奶原创 2020-07-13 23:46:34 · 146 阅读 · 0 评论 -
Acwing350巡逻 题解(树的直径)
(之前写在小号里了,现在大号找回来了,所以再搬回来)一、算法分析1.首先深搜找一次直径。具体方法是先从1点(随便一个点都行)把树拎起来,然后找一条最长路p,再以p把树拎起来,找一条最长路q,最后p和q之间的最短路就是直径(第一次找的时候,最关键的是要记录下来路径上对应的边的id)(用vis数组保存起来,但是注意这个vis后面不会全部都赋值为-1)2.p和q之间的最短路的边权赋值为-13.若k>1,则树形dp再求直径二、注意的点1.前置技能:Acwing1072树的最长路径2.记录链式前原创 2021-10-17 09:41:52 · 133 阅读 · 0 评论 -
(DP006)洛谷P1772 [ZJOI2006]物流运输
一、算法分析先分析题意,首先看到题目,物流运输,再结合题意,发现这个问题并不是问从起点走到终点只走一次的情况。而是问在每天都有物流的情况下,如何规划路线,使得各天的物流成本的总和最小。这道题还设置了某些天的某些点是不可达的,因此需要及时地更换新路线,而更换新路线是需要成本的。自己刚开始看这道题的时候没有头绪,然后看了标签之后发现是DP结合最短路来做,即外层是一个简单的线性DP,内层是最短路。对于DP部分,设f[i]表示前i天的最小花费,则可以选择第j到第i天走同一条路,j是决策变量。状态转移方程详见代码原创 2020-07-29 01:17:58 · 192 阅读 · 0 评论 -
(DP005)[USACO3.3]家的范围 Home on the Range
一、算法分析和其它的相似的找矩形类的DP题一样,这道题需要用正方形的右下角来统计相应的正方形。而状态的转移取决于左上角那个正方形能否向右下角扩展。详见代码及注释。二、代码及注释#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int N=255;int f[N][N][N];原创 2020-07-02 22:44:37 · 323 阅读 · 0 评论 -
(DP004)洛谷P3842 [TJOI2007]线段
一、算法分析这道题乍一看挺没有头绪的,所以先多读两遍题目,把样例的草图画下来,如下图所示,注:题目中的坐标系为算法题常见的坐标系画法,详见下图:然后首先想到,因为不能后退,所以答案与纵坐标无关,只需把所有的横向移动的长度算好之后,最后加上n-1即可。进一步可以想到,可以将纵坐标看做是阶段,将对于左右端点的选择看做是决策,用DP求解最优化问题。即可得:f[i][0]表示当前位于第i行的线段的左端点时的最短路(只计算横向,下同),f[i][1]则表示当前位于第i行的线段的右端点时的最短路。然后再看一下题目原创 2020-05-15 23:20:48 · 234 阅读 · 0 评论 -
(DP003)(状态机模型)洛谷P1353 [USACO08JAN]Running S
一、算法分析这道题可以从状态机的角度来思考,做题前要先画图,将转移的过程画成点与点直接连成的边,然后根据图,写出状态转移方程,然后再开始写代码。此外还要注意边界条件的判断。以f[i][j][0]表示第i分钟用于休息,这分钟结束时恰处于j疲劳度时的最大收益,f[i][j][1]则表示跑步。详见代码及注释。二、代码及注释#include<iostream>#include<cstring>#include<algorithm>#include<cstdi原创 2020-05-08 19:40:50 · 198 阅读 · 0 评论 -
(DP003)背包与dfs综合 以洛谷P1441、P1474、P2347为例
一、流程P1474和P2347可以看做是P1441的子问题,所以先分析P1441,拆解出子问题之后再看P1474和P2347,然后回头解决P1441.二、P1441砝码称重基本思路就是先dfs求出组合,联系前面做过的洛谷P1103书本整理,可以把去掉m个砝码转化为选择n-m个砝码,这样比较好想。求出组合之后,再用背包计算方案数。先是写出求组合的代码,这个比较基础:void dfs(int ...原创 2020-02-25 11:38:18 · 244 阅读 · 0 评论 -
(每日水题004-1)(DP,滚动数组)洛谷P1508 Likecloud-吃、吃、吃
一、算法分析乍一看本题有些没有头绪,本题的特点是终点为第一行的任意数,而起点在最后一行,和常见的题相较是反的,而且起点也不在该行的第一个,而是在中间。。。开始的想法是从起点开始找,但是发现很麻烦,但是在仔细一看,画个图出来,这就是不是倒过来的数塔问题吗???所以解法就很直观了,按照和数塔问题一样的思路,从后往前(也就是从第一行开始)倒着推就行了,答案就在起点上。顺便加了一个滚动数组优化,压成一维...原创 2020-02-24 11:14:46 · 180 阅读 · 0 评论 -
每日水题(003-1)P2697 宝石串
一、算法分析本来打算找一道水题做,结果这道题做了好久。。。对蒟蒻我来说这已经不算水题了。。。可以把绿色珠子记为1,红色记为-1,这样的话,如果一个区间i~j的和为0,那么这个区间上的珠子就是“稳定”的,但是考虑数据范围,直接两层for循环找连续0是肯定不行的,所以就要求一下前缀和,这样只要找到距离最远的一对i和j,使得前缀和数组中a[j]-a[i]等于0即可,但是笔者仍然不会怎么找,想了好久突...原创 2020-02-23 21:58:53 · 399 阅读 · 0 评论 -
(DP002)(滚动数组)洛谷P1541乌龟棋
一、算法分析寒假前曾信誓旦旦说要多练DP,还立了帖子要做一百道,现在继续第二道吧。。。题目很好理解,状态的保存和转移都比较直观,刚开始打算在状态的DP数组加一个步数维度,表示走到第几个格子,但是这样就成了五维数组了,显然会爆空间。后来发现没有必要,当前格子由当前使用的牌的数目完全导出。所以平时解DP问题时,开始可能想到的状态空间很复杂,这个没关系,但是在实现之前一定要进行优化,考察各个维度是否...原创 2020-02-21 01:04:14 · 153 阅读 · 0 评论 -
(蒟蒻的DP入门)(求费用的背包问题)洛谷P2918买干草
一、算法分析显然的背包问题,题目还强调了“每个干草公司的货源都十分充足”,判断是完全背包问题。但是本题的特点在于它是在求最小费用而非最大价值。二、代码及注释#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>...原创 2019-12-29 01:58:58 · 145 阅读 · 0 评论 -
(蒟蒻的DP入门 03)洛谷P2782 友好城市(DP问题的预处理)
一、算法分析所有DP类问题肯定都不是裸题放那里考,所以对DP类问题的解题关键也在于判断其能否用DP来做,以及如何将复杂问题分解为熟悉的类型(如线性DP、树上的DP等),比如这道题友好城市,A桥和B桥不相交的条件显然是两座桥的起点的相对位置和终点的相对位置是一致的,比如第一座桥起点在第二座桥起点的西边,那么第一座桥的终点也应该在第一座桥终点的西边。那么如何建最多的桥呢?这里就要把问题进行分解从而简...原创 2019-12-16 18:43:09 · 241 阅读 · 0 评论 -
(蒟蒻的DP入门01)百练2760 数字三角形
写在前面作为一个蒟蒻,最近开始进军DP受到了巨大阻力啊,总感觉脑子不够用。于是决定以一个蒟蒻的角度把自己的解题思路写出来,编为DP入门系列。评测网站为openjudge的百练那个域。一、算法分析首先考虑数塔的层数,显然题目上足足有一百层,显然用普通的搜索或者枚举是解决不了的,这里联想到DP的思路(注:在这里贪心也不行,因为目光太短浅)。那么如何能够既使得目光长远,又能降低算法复杂度呢?这里我...原创 2019-12-16 11:02:56 · 114 阅读 · 0 评论 -
(DP)一本通 方格取数题解
一、写在前面看一本通看了半天,不明白每道题后面的题号是什么意思(我的是第四版的一本通),比如这个方格取数,后面就跟了一个题号(2.6基本算法之动态规划8786)。后来自己搜到这个原来是在openjudge上的一个名为NOI的域的题库里的题,在这里附上链接:openjudge的NOI域惊讶地发现这里包含了一本通几乎所有的课后习题(甚至包含前几章语言部分的)二、算法这道题四重循环那是相当暴力...原创 2019-12-15 16:29:36 · 235 阅读 · 0 评论 -
DP(001)-洛谷P1233木棍加工
一、算法分析代码里面讲的已经比较详细了,这道题涉及LIS类的问题,而且涉及到dilworth定理。二、代码及注释#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<algorithm>using namespace std;...原创 2019-12-05 02:22:14 · 183 阅读 · 0 评论