
动态规划
Crossing over
这个作者很懒,什么都没留下…
展开
-
CCF CSP 201312 4.有趣的数
数位dp。这种题光看代码真是头疼,想了一个小时才想明白当时的思路。思路如下:题目问你x位有趣的数有多少个,记为c[x],那么就要想出来c[x]怎么用c[x-1]表示。x位有趣的数一定都可以由一个x-1位的数m在末尾添加一个数字而构造出来,分为两种情况:m是有趣的数可以想到,只能在末尾添加1或3,这两种添加方式都一定有效。m不是有趣的数若在m后添加一个数字能使其变为有趣的数,则m一...原创 2019-06-29 23:10:51 · 366 阅读 · 0 评论 -
HDU 2577 How to Type
传送门多阶段决策dp。给你一个只包含大小写字母的字符串,问你打这个字符串最少按多少次键。这题也是够傻逼了。说几点需要注意的:大小写转换不仅可以用capslock,还可以用shift。(通过样例得知)它说的题意是指“在打完所有字后,如果大小写锁定还开着,那么就关闭”。并不是下一个字符是小写字母了就要关capslock。下一个字符是小写字母了但如果就是不关capslock该怎么操作?很简...原创 2019-04-23 20:19:54 · 140 阅读 · 0 评论 -
HDU 1421 搬寝室
传送门多阶段决策dp。(另一种思考方式是转化为求 最小的不相邻的要求必须正好选k个的子序列和。。代码一样。。参考这个的第二种方法)选k对物品,要求每对物品重量的平方差的和最小。这道题必须想清楚一个结论:最优解的每一对物品在排序后的序列中一定都是相邻的。这句话从下面两个方面理解:每一对物品相邻 指的是这对物品内的两个物品是相邻的。最优解的每一对物品都相邻。所以,若n=2k,则最优解可以排...原创 2019-05-03 05:14:20 · 212 阅读 · 0 评论 -
HDU 1176 免费馅饼
传送门数塔dp的变形。从“整个过程分为许多秒,每一秒都要做一个决策,当前位置可转移到最多左右1个单位”这些特征可以看出,这是个类似数塔的dp过程。每一秒只能在一个位置获取馅饼(这一点题目没说清楚),所以把每秒看成数塔的每一层,每层都是11个结点(代表每个位置),每个结点可访问下层的三个结点(不是边界的情况下)。还说“同一秒钟在同一点上可能掉下多个馅饼”,这就意味着数塔上结点的值可以大于1。那么...原创 2019-04-18 22:40:58 · 124 阅读 · 0 评论 -
HDU 1559 最大子矩阵
传送门水题(基本上不能算dp了,就是一个用累加和求区间和(二维版)的思想)。时间复杂度O(n^2)。HDU 1081才是真正的“最大子矩阵和”(最大子串和的二维版)。时间复杂度O(n^3)。因为给定了子矩阵的行数,所以真的不用再来两层循环确定顶行底行了。。。然后还是将之视为一行(每列的累加和)。而且子矩阵的列数也给了,那就对这一行再来一遍累加,然后枚举M-Y+1次就完事了。这种题还可以这么...原创 2019-04-23 16:54:58 · 235 阅读 · 0 评论 -
HDU 2084 数塔
传送门数塔dp。和那种网格dp差不多,也可以有四种做法,不过数塔的终点有n个,如果要让dp[i][j]表示起点到当前点的子问题,最后还要枚举。所以这道题就让dp[i][j]表示当前点(第i行第j个)到终点(最后一行)的子问题的最优解。然后就有两种写法,递推的话只用一个数组就够了(因为访问的之前状态一定已经被计算过了),而递归的话需要一个标记(以判断这个子问题是否被计算过),所以要用两个数组。...原创 2019-04-18 19:41:35 · 114 阅读 · 0 评论 -
HDU 2571 命运
传送门类似数塔问题,其实就是一个网格,每个点都有个值,求从左上走到右下的最大和。从当前位置可到的位置都是在右下方的。和HDU 1978这种题区别不大。虽然那个题是求路径条数,这个题是求路径最大和。但相同之处在于都是这样的网格dp,且每次行走过程都是这样单向(离终点越来越近)且不重复(一条路径上不会有重复点,必然是简单路)的,都蕴含了记忆化搜索的思想(对重叠子问题不必反复处理)。总结一下这种题...原创 2019-04-18 01:31:12 · 172 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping!
传送门这道题是 最大递增子序列和 问题。和 最长递增子序列 问题是差不多的。(LIS)这道题完全不用管那两个起点终点,因为它说了从起点可以直接到任何一个棋子,从任何一个棋子也可以直接到终点,而且起点终点没有数。然后棋子排成一列,每个棋子上都有一个正整数。路线必须向前但可以不连续(符合子序列的定义),而且跳跃路径上的数必须越来越大(严格递增),在满足以上前提下求出最大的路径和(每个棋子上的数相...原创 2019-04-17 21:34:29 · 163 阅读 · 0 评论 -
HDU 2955 Robberies
传送门01背包,,,非常灵活的变形。给你很多个银行(物品),每个银行的钱数(重量)和被抓概率(价值),一个人去抢劫这些银行,但是总体被抓概率要小于一个固定值P,在这基础上最多能抢多少钱。(一个银行要么不被抢,要么全被抢)乍一看肯定是钱数当成价值啊,因为正好要求最大化钱数,所以被抓概率就是重量了?。。不行的。概率值是个小数,而dp[]的下标就是当前背包容量,这概率连乘起来位数多了去了,数组下标...原创 2019-04-15 01:45:09 · 185 阅读 · 0 评论 -
HDU 1257 最少拦截系统
传送门贪心?+二分。(还可以用dp。。)首先要把问题想清楚,每个拦截系统负责拦截的导弹子序列都必须是递减的(不要求严格递减)。给你一个总体的导弹到达序列,问你最少安排多少个拦截系统。可以想到,每个拦截系统都有一个当前可用的上限值,表示这个系统当前可拦截的最大值。对导弹到达序列逐个分析,若当前导弹大于 每一个拦截系统的上限,则一定要安排一个新系统,并把新系统的上限置为当前导弹。若上述条件...原创 2019-04-25 23:09:26 · 216 阅读 · 0 评论 -
HDU 2159 FATE
传送门完全背包,有两维容量。它说的耐久度是根据杀怪来不断减少的,当耐久度降到0或者0以下时就不玩了,但有一个非常重要的地方没有说清。这个判断是在每杀一只怪之前判断还是每杀一只怪之后判断???下面所叙述的一切以及AC代码都是建立在 “之前判断,且降到0判断为可杀、降到0以下判断为不可杀” 的基础上。所以这个耐久度就等价于一个容量的限制,杀的所有怪的耐久度之和要小于等于这个容量。然后还有一...原创 2019-04-21 22:45:33 · 159 阅读 · 0 评论 -
HDU 3631 Shortest Path
传送门floyd插点。(看起来难实际很简单)给你一个有向多重图(就是可能会有重边和自环,对应简单图),会标记一些点,然后再询问给定两点的最短路,要求该最短路上经过的点都是被标记过的(必然包括起点终点)。权值都为正,看样例,发现当起点终点相同时最短路必然是0(当然这个点得标记过才行)。其实这题就是把floyd的第一层循环k拆成在线处理了,你给一个标记点,然后我就运行一遍以这个标记点为k值的2/...原创 2019-04-13 23:00:43 · 225 阅读 · 0 评论 -
HDU 2191 珍惜现在,感恩生活
传送门多重背包。一道带有历史的题啊,沉重的回忆。多重背包的处理关键就是将每种物品的可取个数二进制化,比如一种物品最多取7件,那么就可以转化为3件物品(其中每件物品相当于1,2,4件单位物品),这样包含了取原先物品的任何一种情况(0~7件),并且在求解效率上优于转化为7件相同物品(本质是从O(n)到O(log n)的转变)。以上这个方法务必掌握,除此之外,如果全部只取一种物品都能装满背包了(...原创 2019-04-19 00:28:22 · 302 阅读 · 0 评论 -
HDU 1069 Monkey and Banana
传送门最大递减(广义的递减)子序列和,需要转化。有n种方块,每种方块都有自己的长宽高,每种方块有无限个,每个方块都可以任意摆放,现在让你用方块摞一个塔,对于每上下相邻的方块,下面方块的底面都要完全覆盖(不能正好相等)上面方块的底面,求最大能摞多高。先看题目给的条件,首先,底面完全覆盖和面积更大是不一样的,前者更严。也就是底面的两个维度都要更大。又说方块可以任意摆放,可以想到每个方块都有6种不...原创 2019-04-19 17:09:22 · 138 阅读 · 0 评论 -
HDU 1159 Common Subsequence
传送门最长公共子序列,LCS。可以是0,代表没有任何公共子序列。这道题没给字符串的大小,有点坑。#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <string>...原创 2019-04-19 20:52:48 · 111 阅读 · 0 评论 -
HDU 5179 beautiful number
传送门数位dp。(要考虑前导0,类似还有POJ 3252)定义一种数,要求在其十进制数位上,较高位都>=较低位,且较高位%较低位都是0(较高位都能被较低位整除)。问你[L,R]内有多少个这种数。需要注意几点。dp第二维记录第i+1位数字,整除关系可以传递。中途判断。默认之前位都已满足要求,所以只要当前位能整除第i+1位,就可整除前面任意一位。满足要求的数中,只有一个数可以含有0...原创 2019-07-04 18:33:34 · 187 阅读 · 0 评论 -
POJ 3252 Round Numbers
传送门数位dp。定义一种数,其二进制表示中0的个数大于等于1的个数。给你[Start,Finish],问其中多少个这种数。说几点。首先可以想到,这个题没办法中途continue了,只能到最后(pos==-1)才能判断。状态可以有两种设计方法,一种是两维,分别表示前面数位中0和1的个数;另一种是一维,表示前面数位中0多于1的个数(必须确定谁比谁多,请不要混淆为绝对值)。可以看出,后者...原创 2019-07-04 00:47:18 · 164 阅读 · 0 评论 -
HDU 4734 F(x)
传送门数位dp。给一个函数F(x),然后问你对于[0,B]中的每个数x,满足F(x)<=F(A)的x的个数。inclusive表示闭区间。可以看出,题目定义的这个函数和每个数位相关。所以,在对每个数位进行dfs的过程中,随着这个数一点点被确定,这个数的F(x)也逐渐被确定(而且这个过程是单调递增的,非严格)。所以可以想到dp的第二维表示:从最高位到第i+1位的部分F(x)值。所...原创 2019-07-03 23:01:20 · 176 阅读 · 0 评论 -
HDU 3555 Bomb
传送门数位dp。给一个N,问你从[1,N]中包含49的数的个数。主要有两点。solve(x)求的是[0,x]中不包含49的个数(一检测到“49”就continue了)这题要用__int64,这玩意linux还用不了,所以定义一个typedef是好习惯,方便改。#include <cstdio>#include <iostream>#include <...原创 2019-07-03 22:19:20 · 94 阅读 · 0 评论 -
HDU 2089 不要62
传送门数位dp。给一个左闭右闭区间,统计个数。dp[i][j]表示当前从第i位枚举到最低位(第0位)、在j状态下符合条件的个数。j表示第i+1位是不是6。初识数位dp,说几点看法。之所以要设计这么个dp数组,就是为了重复利用(记忆化搜索)。不这么干的话,每种i,j的组合都可能要被计算多次。现在只用第一次计算,然后再碰见这样的i,j组合就不用再算了。当然,前提是不在limit模式下。...原创 2019-07-03 22:03:18 · 91 阅读 · 0 评论 -
HDU 3709 Balanced Number
传送门数位dp。(这题比较牛批)给你一个数,如果能选取这个数的某个数位作为支点(pivot),使得支点左右两边的各个数位的加权和相等(不包括支点)(权值为该数位到支点的距离),那么就称这个数为平衡数。然后问你[x,y]中有几个平衡数。举个例子,4139是平衡数(以3为支点),20是平衡数(以2为支点)。。。以下几点:将题目条件转化为一个在各个数位上连续计算的公式。就像HDU 4734那...原创 2019-07-07 23:22:48 · 259 阅读 · 1 评论 -
HDU 3652 B-number
传送门数位dp。有一种数,能被“13”整除而且数位里包含“13”,求[1,n]中这种数的个数。for short是简称的意思。之前求过数位里不包含“XX”的,中途判断就可以了。但如果求的是包含的个数,要么取反、要么只能最后判断。以下几点。这道题要用三维状态,两个条件各用一维。这两个条件都是运行到最后一位(反正大概是最后)才能判断出来。对包含“13”的判断,设计三个状态,分别表示:之...原创 2019-07-07 21:59:10 · 193 阅读 · 0 评论 -
HDU 1494 跑跑卡丁车
传送门多阶段决策dp。这道题题意上需要注意两点:(这两点都与实际游戏相悖,出题那年06年我就在玩了,写完这篇我再去下一个,我号上有极品改游侠9我会乱说?)加速行驶的那一段赛道是不会获得能量的。可以认为,判断当前是否废掉一个加速卡(触发条件:当前赛道普通行驶 且 上一段赛道末尾能量值为14,则直接减去4(+1-5)点能量)是在当前赛道的末尾进行的,而下一段赛道是否使用加速卡也是在下一段赛道...原创 2019-04-20 15:02:40 · 173 阅读 · 0 评论 -
HDU 2830 Matrix Swapping II
传送门直方图dp二维版(link)。。的巧妙变形(可以任意交换两列从而构成一个新状态)。以下两点:其实这种题没必要用二维数组了,按照输入的顺序,在输入完每一行后就处理这一行。这样只用开两个列数大小的数组,其中一个缓存上一行(从而构造当前行的数据)。这道题说可以任意交换两列无数次,那么就必须每一行每一行地处理了,因为每行的数据不会乱。这个条件就是等价于可以把每一行的这些柱形排列成一个最优...原创 2019-04-24 18:31:33 · 131 阅读 · 0 评论 -
HDU 2845 Beans
传送门最大不相邻子序列和(二维版本)。(没有负数的版本)这个题先要求出每行的最大不相邻子序列和(所谓不相邻,就是指这个子序列的每个元素在原数组里都是不相邻的),然后将这个矩阵的每行的最优解都当成一个元素,对这个列向量再应用以上。输入按先行再列,所以边输入边求解,也没必要搞二维数组了(这题只给你一个n*m上限就是逼你这么做的)。没有负数的情况下,可以想到,最优解的两个元素中间最多隔两个。还是...原创 2019-04-24 17:05:40 · 145 阅读 · 0 评论 -
HDU 2037 今年暑假不AC
传送门贪心法。贪心策略就是优先选开始时间较晚的节目 或者 优先选结束时间较早的节目,先排序,然后一遍顺序求解。如果要求的不是节目个数最大,而是节目总时长最大(或者每个节目都有一个价值,要求总价值最大),该怎么解决呢?#include <cstdio>#include <iostream>#include <algorithm>#include &...原创 2019-05-04 22:08:24 · 190 阅读 · 0 评论 -
HDU 1203 I NEED A OFFER!
传送门01背包,价值是概率连乘。首先,给的都是某学校被录取的概率,问的是总体被录取的最大概率,所以要转化为都不被录取的最小概率。dp[j]表示(在前i个学校可选取的情况下,)使用的申请费总额不超过j的情况下不被任何一家录取的最小概率。所以初始的dp值都是1.0。本题和HDU 2955的区别在于,前者求最小概率,后者求最大概率。因而要采取不同的策略:本题:因为价值是概率连乘,只会越来越...原创 2019-04-21 20:27:24 · 182 阅读 · 0 评论 -
HDU 1081 To The Max
传送门最大子矩阵和。只用输出这个最大的和。其实就是两个循环枚举出来顶行和底行,把从顶行到底行的这些行合并,看成一行,然后再一个循环计算最大子序列和就搞定了。于是输入的时候让每个元素都存着当前列的累加和(从第一行到当前行对当前列累加),这样不同行的同一列相减就是这列的区间和。#include <cstdio>#include <iostream>#include...原创 2019-04-16 21:58:16 · 395 阅读 · 0 评论 -
HDU 1231 最大连续子序列
传送门参考以前这个,一模一样。#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <string>#include <queue>using nam...原创 2019-04-15 19:05:10 · 105 阅读 · 0 评论 -
HDU 1864 最大报销额
传送门01背包,有一点变形。给一些发票(物品),每张发票都有一个报销额(价值),每张发票还有一个判断合不合法的过程(这题很坑,话都说不明白。它要求的是每张发票上的A,B,C每类都不大于600.0,而不是每一项),每张发票要么全报要么全不报。问你在总报销额不大于Q的情况下最大的总报销额是多少。刚一看会发现一个问题,它没有一个显式的背包容量的概念。(当然,这道题可以把价值和重量当成一个东西,有人...原创 2019-04-15 17:13:36 · 237 阅读 · 0 评论 -
HDU 1688 Sightseeing
传送门求次短路。给一个有向图,给定起点终点,求最短路条数和只比最短路的值大1的路径的条数之和。这道题就是用普通的次短路求解就行了,求出来的次短路如果正好比最短路大1,那么就存在这道题中所谓的“大1次短路”;如果不是则就没有。这道题比较人性化,说了几个关键信息。没有自边(自环),每条边的权值都是正数,可能有重边。权值都是正数意味着没有零环和负环,因为有零环意味着求不出最短次短路径条数(或者在...原创 2019-04-08 21:37:36 · 223 阅读 · 0 评论 -
HDU 1596 find the safest road
传送门[0,1]区间乘积最长路。和这个类似,不过这道题没有大于1的边,所以没有“负环”(在一个环上走不会越来越大)。这道题已经给了邻接矩阵(所以连初始化都不用了),按有向图算,不连通的边都给了0。所以最后查询的时候还是0就意味着不连通。这道题用不着考虑floyd里面那三个相不相等。#include <cstdio>#include <iostream>#inc...原创 2019-04-11 22:48:43 · 124 阅读 · 0 评论 -
HDU 1978 How many ways
传送门dfs记忆化搜索、动态规划。是中文题,但是题意没说清楚,反正把我恶心到了。你是真的牛批。两个地方没说清楚。实际上每到一条路径终点之后就清除身上携带的能量值(若没用完),然后再加上这个路径终点的能量值。若按我理解的那样,则每个点的状态要用三维数组表示,其中第三维表示在当前点含有e能量值到终点的路数。可知当e>=N-x+M-y时的状态都等价。这个题中说的总体路线是一条条路径组...原创 2019-04-11 21:07:49 · 431 阅读 · 1 评论 -
HDU 1599 find the mincost route
传送门floyd求最小环(正环)问题。注意和HDU 1217的区别。这个题就是套路固定这么做的,这个题和负环完全没有一点关系。是个中文题,题意就没啥可说了,这个题是个无向图,求一个至少有三个点的环,这个环在全图所有至少有三个点的环中长度最小(所谓环的长度就是绕着这个环走一圈,每条边的权值之和)。套路就是在floyd的第一层下面,第二三层上面,再加一个两层循环,用来枚举每两个点i,j,首先保...原创 2019-04-01 20:27:22 · 146 阅读 · 0 评论 -
HDU 1142 A Walk Through the Forest
传送门最短路+记忆化搜索。一个无向图,问你从起点到终点有多少条这样的路,该路径包含的边a->b都满足至少存在一条b到终点的路比所有a到终点的路都要短。这道题中path指边,route指路径。这道题比较良心,说了权值都为正。首先这个条件等价于b到终点的最短路小于a到终点的最短路。那么先求所有点到终点的最短路,因为是无向图所以不用反向建边了,直接以终点为源点求最短路。接下来从起点开始df...原创 2019-04-11 00:40:29 · 221 阅读 · 0 评论 -
HDU 2602 Bone Collector
传送门01背包,没有任何变形,模板题。#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <string>using namespace std; // 01...原创 2019-04-01 00:03:25 · 132 阅读 · 0 评论 -
HDU 1114 Piggy-Bank
传送门完全背包。求最小价值(恰好装满)。有一个存钱罐,里面有很多个硬币,硬币分为很多种类,每种有各自的重量和价值。现在给你每种硬币的信息,和这个存钱罐存的重量,让你猜测里面硬币的最小价值。这个题让求最小价值,所以肯定是必须装满了(结合这个题意也必须是重量恰好相等)。最小值一定是必须装满,但必须装满不一定是求最小值。必须装满的话,初始化置为-INF就可以了,但是还是个最小值问题,最小值问题是...原创 2019-03-31 22:35:36 · 114 阅读 · 0 评论 -
HDU 1712 ACboy needs your help
传送门分组背包,需要根据题意稍微转化一下。题中说最多学习课程M天,可视为背包容量;给的矩阵中的每列代表学习花费j天(不是第j天),所以同一行中每列都是互斥的,不能选择超过一个,所以每门课程(每一行)可视为一组,每组内物品最多只能选择一个;另外,这道题中的物品重量就是该物品在矩阵中的列号。可将分组背包视为普通01背包在第二层循环下再套一个循环,用来枚举该组内的每个物品。在第三层循环中,可直接...原创 2019-03-31 21:28:09 · 138 阅读 · 0 评论 -
HDU 2224 The shortest path
传送门属于动态规划。TSP(旅行商)问题的简化版本,双调旅行商问题。时间复杂度O(n^2)。可以参考这个。给你平面上n个点的坐标,这些点的x坐标依次增大,让你找一条满足这样的性质的最短的路:从1出发,沿着x增大的方向走到n,再沿着x减小的方向走回1,在这途中除了1以外的每个点都要访问一次且仅一次。这道题完全就是动态规划,只是背景好像最短路一样,其实和最短路算法没任何关系。我们可以这样想,...原创 2019-03-26 17:08:09 · 174 阅读 · 0 评论 -
HDU 1003 Max Sum
传送门最大子序列和。下标从1开始,输出首尾下标。要求输出多个相等答案中的第一个(从左往右),其实和要求首尾下标最小是一样的。#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include...原创 2019-04-15 19:22:21 · 113 阅读 · 0 评论