自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(113)
  • 收藏
  • 关注

原创 HDU 3709 Balanced Number

传送门数位dp。(这题比较牛批)给你一个数,如果能选取这个数的某个数位作为支点(pivot),使得支点左右两边的各个数位的加权和相等(不包括支点)(权值为该数位到支点的距离),那么就称这个数为平衡数。然后问你[x,y]中有几个平衡数。举个例子,4139是平衡数(以3为支点),20是平衡数(以2为支点)。。。以下几点:将题目条件转化为一个在各个数位上连续计算的公式。就像HDU 4734那...

2019-07-07 23:22:48 239 1

原创 HDU 3652 B-number

传送门数位dp。有一种数,能被“13”整除而且数位里包含“13”,求[1,n]中这种数的个数。for short是简称的意思。之前求过数位里不包含“XX”的,中途判断就可以了。但如果求的是包含的个数,要么取反、要么只能最后判断。以下几点。这道题要用三维状态,两个条件各用一维。这两个条件都是运行到最后一位(反正大概是最后)才能判断出来。对包含“13”的判断,设计三个状态,分别表示:之...

2019-07-07 21:59:10 174

原创 HDU 5179 beautiful number

传送门数位dp。(要考虑前导0,类似还有POJ 3252)定义一种数,要求在其十进制数位上,较高位都>=较低位,且较高位%较低位都是0(较高位都能被较低位整除)。问你[L,R]内有多少个这种数。需要注意几点。dp第二维记录第i+1位数字,整除关系可以传递。中途判断。默认之前位都已满足要求,所以只要当前位能整除第i+1位,就可整除前面任意一位。满足要求的数中,只有一个数可以含有0...

2019-07-04 18:33:34 169

原创 POJ 3252 Round Numbers

传送门数位dp。定义一种数,其二进制表示中0的个数大于等于1的个数。给你[Start,Finish],问其中多少个这种数。说几点。首先可以想到,这个题没办法中途continue了,只能到最后(pos==-1)才能判断。状态可以有两种设计方法,一种是两维,分别表示前面数位中0和1的个数;另一种是一维,表示前面数位中0多于1的个数(必须确定谁比谁多,请不要混淆为绝对值)。可以看出,后者...

2019-07-04 00:47:18 129

原创 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 157

原创 HDU 3555 Bomb

传送门数位dp。给一个N,问你从[1,N]中包含49的数的个数。主要有两点。solve(x)求的是[0,x]中不包含49的个数(一检测到“49”就continue了)这题要用__int64,这玩意linux还用不了,所以定义一个typedef是好习惯,方便改。#include <cstdio>#include <iostream>#include &lt...

2019-07-03 22:19:20 76

原创 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 76

原创 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 334

原创 PAT T1016 Uniqueness of MST(35)

传送门无向图,判断其mst的唯一性,若没有mst则输出连通分量数。结论:只有当原图中存在权值相等的边的情况下,才有可能会造成mst不唯一。还是原来的kruskal算法,但是设置一个两层循环来从小到大遍历边,其中内层循环遍历的都是权值相同的边(神似PAT A1009,在一个有序数列中合并“同类项”。。)使用两个这样的内层循环:前者在上一次外层循环的状态下测试每条边的可用性;(计数变量ed...

2019-06-04 23:34:05 657

原创 关于判定4种无向图的一些想法

回顾了这几道题之后,写一些总结。HDU 1198(求解 无向图 有几个 连通分量)HDU 1272(判断 无向图 是不是 无环连通图)HDU 1325(判断 有向图 是不是 树)下面是无向图的四种情况:无环连通图有环连通图无环非连通图(每一个连通分量都是无环的)有环非连通图(至少有一个连通分量是有环的)边数 = 点数 - 1边数 > 点数 - 1边数...

2019-05-10 02:28:54 562

原创 HDU 2037 今年暑假不AC

传送门贪心法。贪心策略就是优先选开始时间较晚的节目 或者 优先选结束时间较早的节目,先排序,然后一遍顺序求解。如果要求的不是节目个数最大,而是节目总时长最大(或者每个节目都有一个价值,要求总价值最大),该怎么解决呢?#include <cstdio>#include <iostream>#include <algorithm>#include &...

2019-05-04 22:08:24 170

原创 HDU 1421 搬寝室

传送门多阶段决策dp。(另一种思考方式是转化为求 最小的不相邻的要求必须正好选k个的子序列和。。代码一样。。参考这个的第二种方法)选k对物品,要求每对物品重量的平方差的和最小。这道题必须想清楚一个结论:最优解的每一对物品在排序后的序列中一定都是相邻的。这句话从下面两个方面理解:每一对物品相邻 指的是这对物品内的两个物品是相邻的。最优解的每一对物品都相邻。所以,若n=2k,则最优解可以排...

2019-05-03 05:14:20 187

原创 HDU 1257 最少拦截系统

传送门贪心?+二分。(还可以用dp。。)首先要把问题想清楚,每个拦截系统负责拦截的导弹子序列都必须是递减的(不要求严格递减)。给你一个总体的导弹到达序列,问你最少安排多少个拦截系统。可以想到,每个拦截系统都有一个当前可用的上限值,表示这个系统当前可拦截的最大值。对导弹到达序列逐个分析,若当前导弹大于 每一个拦截系统的上限,则一定要安排一个新系统,并把新系统的上限置为当前导弹。若上述条件...

2019-04-25 23:09:26 197

原创 HDU 2830 Matrix Swapping II

传送门直方图dp二维版(link)。。的巧妙变形(可以任意交换两列从而构成一个新状态)。以下两点:其实这种题没必要用二维数组了,按照输入的顺序,在输入完每一行后就处理这一行。这样只用开两个列数大小的数组,其中一个缓存上一行(从而构造当前行的数据)。这道题说可以任意交换两列无数次,那么就必须每一行每一行地处理了,因为每行的数据不会乱。这个条件就是等价于可以把每一行的这些柱形排列成一个最优...

2019-04-24 18:31:33 121

原创 HDU 2845 Beans

传送门最大不相邻子序列和(二维版本)。(没有负数的版本)这个题先要求出每行的最大不相邻子序列和(所谓不相邻,就是指这个子序列的每个元素在原数组里都是不相邻的),然后将这个矩阵的每行的最优解都当成一个元素,对这个列向量再应用以上。输入按先行再列,所以边输入边求解,也没必要搞二维数组了(这题只给你一个n*m上限就是逼你这么做的)。没有负数的情况下,可以想到,最优解的两个元素中间最多隔两个。还是...

2019-04-24 17:05:40 129

原创 HDU 2577 How to Type

传送门多阶段决策dp。给你一个只包含大小写字母的字符串,问你打这个字符串最少按多少次键。这题也是够傻逼了。说几点需要注意的:大小写转换不仅可以用capslock,还可以用shift。(通过样例得知)它说的题意是指“在打完所有字后,如果大小写锁定还开着,那么就关闭”。并不是下一个字符是小写字母了就要关capslock。下一个字符是小写字母了但如果就是不关capslock该怎么操作?很简...

2019-04-23 20:19:54 119

原创 HDU 1559 最大子矩阵

传送门水题(基本上不能算dp了,就是一个用累加和求区间和(二维版)的思想)。时间复杂度O(n^2)。HDU 1081才是真正的“最大子矩阵和”(最大子串和的二维版)。时间复杂度O(n^3)。因为给定了子矩阵的行数,所以真的不用再来两层循环确定顶行底行了。。。然后还是将之视为一行(每列的累加和)。而且子矩阵的列数也给了,那就对这一行再来一遍累加,然后枚举M-Y+1次就完事了。这种题还可以这么...

2019-04-23 16:54:58 203

原创 HDU 2159 FATE

传送门完全背包,有两维容量。它说的耐久度是根据杀怪来不断减少的,当耐久度降到0或者0以下时就不玩了,但有一个非常重要的地方没有说清。这个判断是在每杀一只怪之前判断还是每杀一只怪之后判断???下面所叙述的一切以及AC代码都是建立在 “之前判断,且降到0判断为可杀、降到0以下判断为不可杀” 的基础上。所以这个耐久度就等价于一个容量的限制,杀的所有怪的耐久度之和要小于等于这个容量。然后还有一...

2019-04-21 22:45:33 134

原创 HDU 1203 I NEED A OFFER!

传送门01背包,价值是概率连乘。首先,给的都是某学校被录取的概率,问的是总体被录取的最大概率,所以要转化为都不被录取的最小概率。dp[j]表示(在前i个学校可选取的情况下,)使用的申请费总额不超过j的情况下不被任何一家录取的最小概率。所以初始的dp值都是1.0。本题和HDU 2955的区别在于,前者求最小概率,后者求最大概率。因而要采取不同的策略:本题:因为价值是概率连乘,只会越来越...

2019-04-21 20:27:24 162

原创 HDU 2844 Coins

传送门多重背包,重量与价值相同,恰好装满。和这个题差不多。有n种硬币,每种硬币都有一个数量和价值,问你拿这些硬币能恰好支付多少个价格(价格区间[1,m]),支付每个价格都可用全部的硬币。方法就是将重量和价值视为相同,然后再恰好装满,所以dp[j]表示恰好拿取价值总和为j的硬币所获得的(最大,233)价值。可以想到,这个值要么是非法值,要么是j。这个题给的硬币价值总和的上限太大了,肯定不能用...

2019-04-21 02:46:52 118

原创 HDU 1171 Big Event in HDU

传送门多重背包,有一点变形。意思就是给你n种物品,每种物品都有一个数量和价值,让你把这些物品按照价值分为两份,这两份的价值差值尽可能小,问你这两份的价值分别是多少。虽然这题只给了一个维度,但是照样能转化为背包来做,很简单,将重量和价值看成一个东西,都引用这一个数组就完事了。这样,dp[j]表示的就是“在拿取物品价值总和不超过j的情况下,最多能拿多少价值的物品”,这样看似像一句废话,但请注意...

2019-04-20 20:52:30 104

原创 HDU 1494 跑跑卡丁车

传送门多阶段决策dp。这道题题意上需要注意两点:(这两点都与实际游戏相悖,出题那年06年我就在玩了,写完这篇我再去下一个,我号上有极品改游侠9我会乱说?)加速行驶的那一段赛道是不会获得能量的。可以认为,判断当前是否废掉一个加速卡(触发条件:当前赛道普通行驶 且 上一段赛道末尾能量值为14,则直接减去4(+1-5)点能量)是在当前赛道的末尾进行的,而下一段赛道是否使用加速卡也是在下一段赛道...

2019-04-20 15:02:40 157

原创 HDU 1159 Common Subsequence

传送门最长公共子序列,LCS。可以是0,代表没有任何公共子序列。这道题没给字符串的大小,有点坑。#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <string&gt...

2019-04-19 20:52:48 102

原创 HDU 1069 Monkey and Banana

传送门最大递减(广义的递减)子序列和,需要转化。有n种方块,每种方块都有自己的长宽高,每种方块有无限个,每个方块都可以任意摆放,现在让你用方块摞一个塔,对于每上下相邻的方块,下面方块的底面都要完全覆盖(不能正好相等)上面方块的底面,求最大能摞多高。先看题目给的条件,首先,底面完全覆盖和面积更大是不一样的,前者更严。也就是底面的两个维度都要更大。又说方块可以任意摆放,可以想到每个方块都有6种不...

2019-04-19 17:09:22 121

原创 HDU 2191 珍惜现在,感恩生活

传送门多重背包。一道带有历史的题啊,沉重的回忆。多重背包的处理关键就是将每种物品的可取个数二进制化,比如一种物品最多取7件,那么就可以转化为3件物品(其中每件物品相当于1,2,4件单位物品),这样包含了取原先物品的任何一种情况(0~7件),并且在求解效率上优于转化为7件相同物品(本质是从O(n)到O(log n)的转变)。以上这个方法务必掌握,除此之外,如果全部只取一种物品都能装满背包了(...

2019-04-19 00:28:22 281

原创 HDU 1176 免费馅饼

传送门数塔dp的变形。从“整个过程分为许多秒,每一秒都要做一个决策,当前位置可转移到最多左右1个单位”这些特征可以看出,这是个类似数塔的dp过程。每一秒只能在一个位置获取馅饼(这一点题目没说清楚),所以把每秒看成数塔的每一层,每层都是11个结点(代表每个位置),每个结点可访问下层的三个结点(不是边界的情况下)。还说“同一秒钟在同一点上可能掉下多个馅饼”,这就意味着数塔上结点的值可以大于1。那么...

2019-04-18 22:40:58 113

原创 HDU 2084 数塔

传送门数塔dp。和那种网格dp差不多,也可以有四种做法,不过数塔的终点有n个,如果要让dp[i][j]表示起点到当前点的子问题,最后还要枚举。所以这道题就让dp[i][j]表示当前点(第i行第j个)到终点(最后一行)的子问题的最优解。然后就有两种写法,递推的话只用一个数组就够了(因为访问的之前状态一定已经被计算过了),而递归的话需要一个标记(以判断这个子问题是否被计算过),所以要用两个数组。...

2019-04-18 19:41:35 99

原创 HDU 2571 命运

传送门类似数塔问题,其实就是一个网格,每个点都有个值,求从左上走到右下的最大和。从当前位置可到的位置都是在右下方的。和HDU 1978这种题区别不大。虽然那个题是求路径条数,这个题是求路径最大和。但相同之处在于都是这样的网格dp,且每次行走过程都是这样单向(离终点越来越近)且不重复(一条路径上不会有重复点,必然是简单路)的,都蕴含了记忆化搜索的思想(对重叠子问题不必反复处理)。总结一下这种题...

2019-04-18 01:31:12 152

原创 HDU 1087 Super Jumping! Jumping! Jumping!

传送门这道题是 最大递增子序列和 问题。和 最长递增子序列 问题是差不多的。(LIS)这道题完全不用管那两个起点终点,因为它说了从起点可以直接到任何一个棋子,从任何一个棋子也可以直接到终点,而且起点终点没有数。然后棋子排成一列,每个棋子上都有一个正整数。路线必须向前但可以不连续(符合子序列的定义),而且跳跃路径上的数必须越来越大(严格递增),在满足以上前提下求出最大的路径和(每个棋子上的数相...

2019-04-17 21:34:29 147

原创 HDU 1081 To The Max

传送门最大子矩阵和。只用输出这个最大的和。其实就是两个循环枚举出来顶行和底行,把从顶行到底行的这些行合并,看成一行,然后再一个循环计算最大子序列和就搞定了。于是输入的时候让每个元素都存着当前列的累加和(从第一行到当前行对当前列累加),这样不同行的同一列相减就是这列的区间和。#include <cstdio>#include <iostream>#include...

2019-04-16 21:58:16 347

原创 HDU 2870 Largest Submatrix

传送门这道题虽然名字叫,但并不属于最大子矩阵问题。还是直方图dp二维化(实际上,这类问题可以看成只有0和1的最大子矩阵和的问题)。和上一篇基本一样,只不过这个题还得重复三遍。这道题还是让你找一个单一字母构成的最大矩形,a,b,c三种字母不能换成别的,而别的都能换成a,b,c。所以只用考虑a,b,c这三种,每考虑一种时,都让这种字母尽可能多,将其他不是这种字母的都看成另一种。这道题还是需要注意...

2019-04-16 20:39:31 216

原创 HDU 1505 City Game

传送门直方图dp二维版本。给你一个N*M的网格,每个格子有两种状态(R,F),让你在其中找一个面积最大的全部由F组成的矩形。思路就是把每一行都当成一个直方图dp,总共求解N次取最大值。每一行每一列的柱子的高度可以看成从当前网格出发向上,碰到第一个R为止(不包括),有几个连续的F(包括自己)。若当前网格就是R,那么当前柱子高度就是0。网格是一行行输入的,若当前行当前列是F,那么具体的高度值...

2019-04-16 17:06:54 152

原创 CCF CSP 201312 3.最大的矩形

直方图dp。上篇说过了,一模一样。但是这个题的结果不会溢出。一种是我上一篇的方法,从中间开始往两头找,同时利用了历史信息。另一种是我两年前写的方法,比较直观的枚举两端点,总共枚举n(n-1)/2对。每次找出这个区间内的最小高度。区间最小高度在左端点不变,右端点往右移动的过程中传递下去,因为它只会变得越来越小。第一个:#include <iostream>#includ...

2019-04-16 00:52:05 281

原创 HDU 1506 Largest Rectangle in a Histogram

传送门直方图dp。可以借鉴最大连续子序列的思想,可以想到最后答案的形状一定是某个完整的柱形以自己完整的高度同时往左右扩散,扩散到什么地步呢?往左扩散到第一个小于自己高度的地方(从右往左数,不包括),往右扩散到第一个小于自己高度的地方(从左往右数,不包括)。也就是说,中间这个完整的柱形一定是整个矩形的最低点(木板效应)。所以这N个柱形,每一个柱形都对应一个这样的基于自身的最大矩形。那么最终答案...

2019-04-15 23:21:14 146

原创 HDU 1003 Max Sum

传送门最大子序列和。下标从1开始,输出首尾下标。要求输出多个相等答案中的第一个(从左往右),其实和要求首尾下标最小是一样的。#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include...

2019-04-15 19:22:21 100

原创 HDU 1231 最大连续子序列

传送门参考以前这个,一模一样。#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <string>#include <queue>using nam...

2019-04-15 19:05:10 89

原创 HDU 1864 最大报销额

传送门01背包,有一点变形。给一些发票(物品),每张发票都有一个报销额(价值),每张发票还有一个判断合不合法的过程(这题很坑,话都说不明白。它要求的是每张发票上的A,B,C每类都不大于600.0,而不是每一项),每张发票要么全报要么全不报。问你在总报销额不大于Q的情况下最大的总报销额是多少。刚一看会发现一个问题,它没有一个显式的背包容量的概念。(当然,这道题可以把价值和重量当成一个东西,有人...

2019-04-15 17:13:36 214

原创 HDU 2955 Robberies

传送门01背包,,,非常灵活的变形。给你很多个银行(物品),每个银行的钱数(重量)和被抓概率(价值),一个人去抢劫这些银行,但是总体被抓概率要小于一个固定值P,在这基础上最多能抢多少钱。(一个银行要么不被抢,要么全被抢)乍一看肯定是钱数当成价值啊,因为正好要求最大化钱数,所以被抓概率就是重量了?。。不行的。概率值是个小数,而dp[]的下标就是当前背包容量,这概率连乘起来位数多了去了,数组下标...

2019-04-15 01:45:09 168

原创 HDU 3832 Earth Hour

传送门三点连通。给你一个平面,上面有很多个点,给你每个点的坐标,每个点还有个半径,两个点之间有一条无向边当且仅当以两点为圆心的两圆相切或相交。在给定的三个关键点之间互相连通的基础上,问你最多拿走多少个点(拿走的这些点相当于不存在了,完全不参与那三个关键点的连通)。毫无疑问,这题首先我们得建边,比较两圆心的距离和半径之和即可。然后这个无向图就出来了。然后考虑一下,这题问的是最多拿走多少点,那相...

2019-04-14 22:11:29 243

原创 HDU 3631 Shortest Path

传送门floyd插点。(看起来难实际很简单)给你一个有向多重图(就是可能会有重边和自环,对应简单图),会标记一些点,然后再询问给定两点的最短路,要求该最短路上经过的点都是被标记过的(必然包括起点终点)。权值都为正,看样例,发现当起点终点相同时最短路必然是0(当然这个点得标记过才行)。其实这题就是把floyd的第一层循环k拆成在线处理了,你给一个标记点,然后我就运行一遍以这个标记点为k值的2/...

2019-04-13 23:00:43 210

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除