自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

做一只熊猫不好吗?

山登绝顶我为峰!

  • 博客(372)
  • 收藏
  • 关注

原创 nth Permutation LightOJ - 1060(逆康托展开 + 不重复全排列)

题目链接题意给我们一个长度不超过 20 个字母的字符串 s,为第 k 小的字符串是哪个? 如果不存在输出 - 1思路这题的本质就是 逆康托展开,但是由于 s 中可能出现重复的字符,因此我们需要在 逆康托展开 的基础上稍微变一下求解字符串的时候有一个重要的贪心思想:如果第 d 位置选择 i 字母的方案数 大于等于 k 的话, 第 i 个字母一定是 d 位置所需要的字符!!!代码#include <bits/stdc++.h>using namespace std;#def

2021-06-08 20:53:29 8

原创 Painful Bases LightOJ - 1021(状压 dp)

题目链接题意给我们一个 n 进制的数和一个数字 k,n <= 16, k <= 20, 这个 n 进制数中的每个进制为 的数字各不相同,现在我们可以重新给这个数字的每个进制位重新安排顺序,问有多少种方案数组成的数是 k 的倍数。题意一看到 n 很小,又是让求方案数,那肯定是状压 dp 了又因为组成的数是 k 的倍数,且 k 比较小,那么需要 dp 中的一维,去枚举组成的数 % k 之后的余数。那么 dp 方程为 dp [x][sta] 在状态为 sta 的时候组成的数

2021-06-08 20:40:17 8

原创 Clarke and problem HDU - 5464(dp 类似背包转移)

题目链接题意给我们 n 个数的,我们可以从中选择任意个数把这些数的值加起来,要求这个数是 m 的倍数,问我们组成的数字是的倍数是 m 的方案数,注意一个也不选组成的数是 0 也算一种合法方案。n <=1000, p<=1000.思路一看到组成的数是 m 的倍数就要明白我们可以在 dp 的状态中用一位 去枚举余数,其实 dp 方程很容易就可以猜出来:dp [i][j] 表示前 i 个数从中选择一些数字的和是 % m 的余数是 j 的方案数,那么答案就是 dp [n][0] 了

2021-06-08 20:23:43 8

原创 Collecting Gold LightOJ - 1057(TSP+bfs)

题目链接思路bfs 预处理两点之间的最短路径,然后用状压 dp 解决 TSP 问题#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define sc scanf#define pr printf#define fi first#define se second#define pb push_back#define m_p make_pair

2021-06-08 20:06:24 7

原创 Fast Bit Calculations LightOJ - 1032(数位 dp)

题目链接题意让我们求 1~n 中的每个数二进制连续 1 的个数。思路老数位 dp 水题了,但是我们在记录状态的时候 dp 要开三维,dp [i][j][k] 分别记录当前在第 i 层,从根节点到当前第 i 层的节点的搜索路径上的 1 的个数,k 表示从 当前节点到最后一层的中包含 1 的个数。需要注意数位 dp 最难的就是要把状态记录完整、不重复!!!代码#include <bits/stdc++.h>using namespace std;#define db do

2021-06-08 19:59:29 9

原创 Good or Bad LightOJ - 1051(递推 dp)

题目链接题意给我们一个有小写字母和‘ ?’ 组成的字符串,我们可以把 ?替换从任意小写字母,如果不论我们怎么替换,这个字符串都会包含连续的 3 个元音字符或 5 个连续的辅音的话,这个串就是一个 bad 串。如果不论我们怎么替换,这个字符串都不会包含连续的 3 个元音字符或 5 个连续的辅音的话,这个串就是一个 good 串。否则是一个 mixed 串,现在问我们 s 是那个类型的串?思路设 f1 [i][j] 表示在 i 个位置为结尾,有 j 个连续元音字符的这种情况是否存在,设

2021-06-08 19:49:33 23

原创 Brush (III) LightOJ - 1017(递推 dp)

题目链接题意在一个矩阵网格中的某些网格中有灰尘需要打扫,问每次可以选择 w 行进行打扫、清除这 w 行中的所有灰尘,问进行 k 次打扫之后最多可以清除的灰尘数量是多少?思路dp [i][j] 在第 i 个灰尘为终止行出打扫 j 次所能清除的最多灰尘数。然后暴力枚举 i、j 进行状态转移就行了代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#def

2021-06-08 19:23:52 7

原创 Palindrome Sub-Array HDU - 4618 (简单 dp)

题目链接题意给我们一个 n * m 的矩阵,让我们求一个最大的 k*k 的子回文矩阵,输出最大的这个 k 是多少?回文矩阵:每一行、每一列都是回文。思路暴力枚举子回文矩阵的位置(注意这个位置要枚举奇偶情况),并且在这个位置暴力判读回文矩阵的边长复杂度:O (300 * 300 * 300)代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#defi

2021-06-08 19:13:52 8

原创 Crime HDU - 4623(等价类+变进制哈希+状压 dp)

题目连接题意让我们求 1~n (n <= 28)的排列中相邻元素互质的排列有多少个?思路很不错的一题,一个间的状压 dp,当 n 的值太的时候,使用了等价类进行优化,有使用了变进制哈希,去减少状态状态枚举个数。如果我们先不考虑 n 的大小的时候,如果我们用状压 dp 去做的话,只需设状态转移数组为:dp [sta][x] 在状态为 sta,且最后一个数字 x 的时候,相邻元素互质的的排列的方案数,其实 dp [sta][x] 已经能够完美的表示我们状态转移所需要的信息了,我们可以 从

2021-06-08 19:02:57 23 1

原创 Island and study-sister HDU - 4640(最短路 spaf+状压 dp + 背包)

题目链接题意给我们一个 n 个点 m 条边的无向图,k 个学姐在 k 个各不相同的节点上等待 acm 队员的帮助,现在有有一对 acm 队员共 3 个人在节点 1,当 acm 队员接到帮助请求之后,3 个队员立刻出去 k 个节点上(可以有队员停留在节点 1 不动),有一个特殊的规定:每个节点只能被一个人走(可以被这个人走多次), 当这个人走完之后,其他人都不在走这个节点的了,问现在最晚受到帮助的学姐被帮助的最早时间可以是多少时间(在合理安排 3 个人的路径之后)。思路很棒的一题 (* ̄︶

2021-06-08 18:10:59 11

原创 Dice HDU - 4652(期望 dp 推公式)

题目链接题意有两种询问:0 m n 让求 m 面的筛子,期望要多少出筛子,使最后 n 次筛子所出现相同的面。1 m n 让求 m 面的筛子,期望要多少出筛子,使最后 n 次筛子所出现面,两两不同。思路 最后 n 次相同 最后 n 次各不相同代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define sc scanf#

2021-06-04 21:10:14 10

原创 找硬币 计蒜客 - T2959(递推 dp)

题目链接题意有一个无穷货币面值序列:bi, 要求这个序列的第一个硬币的面值 b1 = 1, 我们可以自定 b2 及往后所有硬币的面值,当 i>=2 的时候且 bi 是 bi-1 的倍数,现在我们有 n 个物品,每个物品的花费为:ai,求把所有的物品购买下来所需要的最小硬币个数是多少?在我们合理规划硬币的面值 bi 的情况下。思路挺不错的一题。。。虽然没有做出来 ╮(╯▽╰)╭当时在考虑状态转移的时候,一直找不到 到底使用哪个状态进行转移的,其实这题的状态转移是通过倍数关系去实现的,

2021-06-04 20:31:54 14

原创 Neighbor House LightOJ - 1047(线性 dp)

题目链接题意每个房子可以染成 r、g、b 三种颜色,染成对应的颜色有对应的花费。先在要 n 个相邻的房子染成颜色,并且要求相邻的房屋不能染成相同的颜色,问把所有的房子都染了合适的颜色之后的最小总花费是多少?思路设 dp [i][x] 前 i 个房子染完颜色,且第 i 个房子染成 x 颜色的最小花费。dp [i][x] 可以从 dp [i][y] 进行转移,当(x != y)的时候#include <bits/stdc++.h>using namespace std;#d

2021-06-01 10:24:29 14

原创 Derangement HDU - 4689(思维 dp)

题目链接题意对于一个 n 个元素的错排数组 a, 如果我们令 bi = a[i] - i > 0 ~?~ + : -||||| 现在给我们一个 n 个元素的 b [] 数组,问我们有多少个 n 个元素的排列 a [],要求 a 数组必须是错拍数组方案数。思路这题的 dp ,方法真的很奇特,首先我设 dp 方程为:dp [i][j] 表示前对于字符串前 i 位置,我们把前 i 个位置中的 - 都已经选择数字填上了,还有 j 个 + 正号没有确定选择哪个数字填到对应的数字位置上,这里我们

2021-06-01 09:48:36 11

A Refining Company LightOJ - 1036(递推 dp)

题目链接题意给我们一个 n * m 方格,之后输入的时候,输入两个 n *m 的矩阵 a、b,a [i][j] 表示第一种矿石在 (i, j) 位置有 a [i][j] 个, b [i][j] 表示第二种矿石在(i,j)位置有 b [i][j] 数量的矿石。思路这题是第二次做… 还是没有做出来,这个人是真的菜啊。。。我们设状态转移方程为:dp [x][y] 表示以左上角为(1,1)有下角为(x, y)的矩形的最大收益,那么所这题的答案就是 dp [n][m], 这题首先我们要明白一点如果我

2021-06-01 08:45:00 14

原创 Agent 47 LightOJ - 1037(状压 DP)

题目链接题意一个杀手要去刺杀 n 个敌人,每个敌人都有 hp [i] 的声明值,刚开始的时候这个杀手只有一个攻击为 1 的武器(对这 n 个的攻击都是 1),杀手攻击一次敌人,敌人会减少 当前杀手正在使用的这个武器对这个敌人的攻击力的血量,当杀手杀死一个敌人之后会获取这个敌人的武器,这个 n 个人总共有 n 把武器,给我们一个 n * n 的矩阵 a [][],在(i,j) 位置的数字告诉我吗 第 i 把武器对滴 j 个人造成的伤害为 a [i][j].思路n 最大为 16,可以用状压

2021-05-31 20:53:40 60 2

原创 Discovering Gold LightOJ - 1030(概率 dp)

题目链接题意有一个 1 * n 的表格,每个格子上有一些金币,刚开始在第一个格子上,在当前位置,每次我们可以摇一个 6 面筛子,摇到几向前走几步,当摇的点数太大,使人走出表格的时候,要重新摇筛子直到能不走出表格位置,走到第 n 个格子位置,求走到 n 的期望得到的金币数量.思路期望 dp,从后往前递推,dp [i] 表示从 i 位置到 n 位置的期望得到的金币数,dp [i] 可以从 i 后面的 min (6, n - i) 个位置转移过来,假设这个转移过来的位置为 x,那么状态转移方程为

2021-05-31 17:14:01 14

原创 Monkey Banana Problem LightOJ - 1004(递推 dp)

题目链接思路经典的数塔题,直接从上往下递推就行了。。。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define sc scanf#define pr printf#define fi first#define se second#define pb push_back#define m_p make_pair#define Pi

2021-05-31 16:29:06 11

原创 Pieces HDU - 4628(状压 DP + 回文序列预处理)

题目链接题意给我们一个长度小于等于 16 的字符串 S,每次操作我们可以删除 S 中的一个回文子序列,问最少需要多少次操作可以将完全 S 删除。思路数据范围比较少,可以考虑状压 dp。接着怎么考虑状压?其实我们可以确定,这题可能有一个或者多个最有删除顺序, 对于某个最优的删除顺序,如下图:我们可以从上图可以看出,一个大集合的最有拆分操作次数答案,我们不知道,但是我们可以通过去把这个大集合暴力枚举拆分成两个小集合,通过两个小的集合的最优解,拼凑出我们的答案的最优解,对于差分出的小集合,我

2021-05-31 16:01:00 20

原创 Generating Palindromes LightOJ - 1033(区间 dp)

题目链接题意给一个字符串,问最少要插入几个字符,让这个字符串变成回文串。思路很经典的区间 dp,设 dp [i][j] 表示将 [i, j] 这个区间变成回文串所需要的最短插入字符次数,状态转移如下:代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define sc scanf#define pr printf#define fi f

2021-05-31 08:23:06 13

原创 Generating Palindromes LightOJ - 1033(数位 dp)

题目连接题意给我们一个数 n,让求 0~n 中所有数的连续 1 的数量和。某个数的连续 1 的数量和,这个数的相邻 bit 位都是 1,那么连续 1 数量 + 1思路老数位 dp 了,这题一开始 dfs 记忆化 dp [pos][pre] , 只开了两维,是无法完全记录状态的 (是因为当前这个 dp 状态不仅受 1~pos 位中 连续 1 的数量影响,还受 pos+1 到 p位之间的连续 1 影响!!!,p 为 当前某个数二进制位的位数),所以求的方案总是少… 因此我们把 dp 数组开

2021-05-30 21:14:25 10

原创 Love Calculator LightOJ - 1013(线性递推 dp)

题目连接题意给我们两个字符串 a、b , 问我们两个问题:1. 输出 最短的字符串 s 的长度是多少,要求 a、b 都最为子序列出现在 s 中。2. 在最短长度的基础上,s 字符串有多少种方案数。思路对于第一问最短长度模拟一下就可以得出:n + m - LIS (a,b), 其中 n = strlen (a), m = strlen (b) , LIS (a, b) 是 a、b 的最短公共子序列。对于第二问求方案数:自己做的时候没有思路,但是盲猜了一下状态转移方程为:dp [x][i][

2021-05-30 19:35:50 11

原创 Marriage Ceremonies LightOJ - 1011(状压 dp\二分图最优匹配 KM\最小费用最大流)

题目链接题意给我们 n 个男人和 n 个女人进行匹配,任意两个人之间进行匹配有一个权值,问怎样男女之间应该怎样匹配使总权值和最大思路这明显是一个二分图最大权匹配,可以用 KM 算法去做也可以用网络流去做,由于 n<=16 , 这一题甚至可以 dfs 去做,当然也可以同 状压 dp 去做,这里说一下怎么用状压 dp 去做,看数据范围应该可以考虑到状压 dp,但是这题我们要想的是应该怎么去状压 dp,去状态转移呢?其实首先我们进行状态转的时候,我们不知道、也不法确定 第 x 个男人要

2021-05-30 17:06:42 11

原创 Palindrome Partitioning LightOJ - 1044(区间 dp)

题目传送门题意给我们一个字符串 S,问可以将 S 分割成几个子区间,要求分割出的每个子区间的都是回文串,输出最小分割成的区间的数量。思路这题明显是区间 dp,设出来状态转移方程:dp [i][j] 表示将 [i, j] 这个区间分割成的最少会问区间的数量。考虑状态转移:[i, j] 这个区间的最优值来自它的子区间组成,于是我们枚举 [i, j] 区间的分割点,去转移:当 S [i] == s [j] 的时候 我们把 dp [i][j] 初始化为 dp [i+1][j -1], 否则初始化

2021-05-30 12:20:52 21

原创 Race to 1 Again LightOJ - 1038(概率 dp)

题目链接题意给一个数 n ,每次操作这个 n 会等概率的变成它的一个因子,问经过多少次操作,这个数 n 变成 1,求期望操作次数思路一道很明显,有经典的期望 dp,期望 dp 是从后往前递推而来,对于这题来说就是:从最终状态 1 -> 递推出 n 这个值期望的次数,总感觉这样说不太对,其实我的理解就是,我们对当前的数 x 进行一次操作后 x 会变成的它的因子,那么当前的 dp 状态就要从它的子状态(即:因子的 dp 状态)转移而来。我们设从 x 变到 1 期望次数为 dp [x],

2021-05-30 11:01:39 4

原创 AC自动机模板

知识点视频讲解文章讲解LuoguP3808【模板】AC 自动机(简单版)#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int n;char s[N];namespace AC{int tr[N][26], tot;int e[N], fail[N]; //e[i] 表示以 i 这个节点编号位置为结尾的单词有多少个void insert(char s[]){

2021-05-26 21:00:27 23

原创 O - Mondriaan‘s Dream POJ - 2411(dfs + 状态压缩)

题意现在要用个 1x2 的小方格,去填满 h * w 的大方格,求填满方格的方案数思路以每一列的格子中 0、1 分别表示未被小方格覆盖、被小方格覆盖,对每一列的格子被覆盖的状态进行状态压缩,用 dfs 枚举当前列的状态,并同时求出要转移的下一列的状态,进行状态转移就行了代码#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algo

2021-05-16 22:30:07 12

原创 K - Oh My Holy FFF HDU - 4719(线段树 + dp)

题意有 n 个人从左到右的排队,对应的身高的为 Hi, 先在你可以将这个队伍分成若干个连续 group, 且每个 group 中的人数不能超过 L,要求从第二组开始每组的最后一个人的高度比前一组的最后一个人的高度高,第 i 组最后一个人的高度为 bi,那么分组总分数和为:求一个合理的分组方案,让分组分数最大。思路这题我们假设 dp [i] 表示前 i 个人分组的最大得分,我们对每个 i 位置多考虑 dp [i] , 当我们一直考虑到 dp [n] 的时候就得到的答案了,当 n 的数据范围较小

2021-05-16 22:14:43 22 1

原创 D 成 救 翻 写 不 一 快 乐

题目链接思路首先题目只有四种卡片,总共有 m 张,且卡片数字和为 n,让我们求出一种最佳的组合方式,使能获得的价值最大。由于数据比较小,且无法应用贪心去做这一题,于是去想是 dp 问题明显 m 张卡片的使用顺序决定了答案的优劣,让我在选择卡片的时候,无法确定当前应该使用哪种卡片,当前使用的卡片的种类会影响后面的卡片的使用,既然在当前无法确定应该从哪种卡片开始使用?那么这个时候我们就暴力的枚举用哪一种卡片,用了这个中卡片之后会 递归或转移 到那个状态,与就有了 dp [a][b][c][d](.

2021-05-12 10:12:00 13

转载 ACM 所有算法

2021-04-27 19:37:09 20 1

原创 树上启发式合并(dsu on tree) ——模板

讲解讲解传送门复杂度证明例题传送门代码#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 5;int n;// g[u]: 存储与 u 相邻的结点vector<int> g[N];// sz: 子树大小// big: 重儿子// col: 结点颜色// L[u]: 结点 u 的 DFS 序// R[u]: 结点 u 子树中结点的 DFS 序的最大值// Node[i

2021-04-16 10:05:27 27

原创 树链剖分——模板

知识点讲解视频讲解博客讲解 1博客讲解 2oi-wiki 讲解重链刨分代码#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>#include <string>#include <queue>#include <map>#include <bi

2021-04-14 10:54:48 21

原创 K 因子最小数 Gym - 102785D

题意由 k 个不同因子组成的最小数,k <= 1000, 需要用大数去写。思路数n=p1r1+p2r2+p3r3+...+pmrm n=p_1^{r1}+p2^{r2}+p3^{r3}+...+pm^{rm}n=p1r1​+p2r2+p3r3+...+pmrm, 组成的因子个数为:(r1+1)∗(r2+1)∗(r3+1)∗...∗(rm+1)(r1+1)*(r2+1)*(r3+1)*...*(rm+1)(r1+1)∗(r2+1)∗(r3+1)∗...∗(rm+1), 若具有 k 个因子

2021-03-30 09:00:18 30

原创 B - 太空飞行计划 LibreOJ - 6001(最大权闭合子图 模板)

题意给我们 m 个实验,n 个实验仪器,每个实验需要 n 个仪器中的一部分(看做图中的边),每个仪器如果被使用要先被购买,而被购买的时候需要花上一定的费用,而我们做某个实验会得到特定的收益。现在让我们合理的选择一些实验,是使净收益最大,输出做大的值和选择了那些实验, 以及实验的用的仪器。思路首先介绍什么是:“最大权闭合子图”,简单说就是我们在一个图有向图中选择一个点,而这些点指向的下一个点也在我们所选择的集合中。对应到我们这题里就是我们我们要选择做某个实验就要,就要选(买)这个实验所要求

2021-03-24 21:27:19 23 1

原创 A - 搭配飞行员 LibreOJ - 6000(最大流 或 二分图最大匹配)

题意总共用 n 个点,这个 n 个点可以被分割成两个集合中去,我们假设为 左集合 L、右集合 R,其中 L 中的元素只能与 R 中的某些元素进行匹配,问左集合 L 中的元素最大可以和 R 中的集合一对一形成的最大匹配数是多少?思路因为这题中的点可以备份为两个集合,所以是让求的二分图最大匹配,如果不能被分成两个集合,那就要用 一般图的二分图最大匹配算法(带花树算法)了,二者这题我们只需要 跑一个二分图最大匹配就行了,或者建图跑网络流,虚拟出一个 超级源点是 S 与 L 集合中的元素相连,流

2021-03-24 21:02:45 18

原创 传递闭包经典题

传递闭包:给了 a 与 b 的关系,又给了 b 与 c 的关系,我们可以推测出 a 与 c 的关系,这个过程就是传递闭包。过程for_(k, 1, n) for_(i, 1, n) for_(j, 1, n) { if(g[i][j] == 0) g[i][j] = (g[i][k] & g[k][j]); }传递闭包经常与 T.

2021-03-16 17:45:15 78

原创 A - Fire Net HDU - 1045(二分图最大匹配)

题意给定一个二维表格,表格中的某些点有障碍物,可以阻挡子弹穿过,现在让我们在表格中的空格中放置尽可能多的 炮塔,炮塔可以向四个方向发射子弹,问我们最多可以放置多少个炮塔,这些炮塔中不能互相攻击。思路只有在有障碍物阻隔的情况下,才会出现一行有多个炮台的情况,因此我们可以对每一行没有障碍物阻挡的区域进行缩点并编上一个编号,放到左点集中,同理对每一列没有障碍物阻挡的取余进行缩点,并依次编上编号,放到右点集中。对左右集合进行二分图最大匹配,答案就是最大的匹配的数量考虑为甚么这样是对的,我的

2021-03-16 17:12:30 28

原创 最短路 HDU - 2544(Dijkstra 模板)

知识点传送门最短路 HDU - 2544#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>#include <string>#include <queue>#include <map>#include <bitset>#include <v

2021-03-16 16:48:05 34

原创 Codeforces Round #706 (Div. 2)(A~D)

A. Split it!思路这个只需要判断首、尾字符匹配的个数与 k 的关系就行了代码#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>#include <string>#include <queue>#include <map>#include <

2021-03-16 16:41:57 21

原创 M - M Gym - 101498M(dfs 暴力+剪枝)

题意在正坐标轴上,有 n 个点,其中有一个固定点 0,之后给我们 n * (n-1)/2 条边,表示某个点到另一个一个点的距离,现在让我输出,这 n 个点的位置。思路代码#include <algorithm>#include <cstdio>#include <cstring>#include<iostream>#include<string>#include <cstdlib>#include&lt

2021-03-16 14:17:02 955 3

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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