自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 P3092 [USACO13NOV]No Change G(状压dp+二分)

[USACO13NOV]No Change G - 洛谷由于需要顺序的付完N个物品,那么说明具有单调性,二分一下就好了我们可以思考怎么定义状态不妨让状态定义为当前最多付了多少物品,这样子就可以保证单调性了#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 17, M = 1 << 17;c...

2022-02-27 15:19:04 415

原创 292.炮兵阵地(棋盘类状压dp)

292. 炮兵阵地 - AcWing题库分析:限制条件:考虑上下 同一列两格内不能放 不能 (x>>i&1) && ((x>>(i+1)&1) || (x>>(i+2)&1)) 考虑左右 同一行两格内不能放 要满足 (a&c|a&b|c&b)==0 只能在平原上面放状态表示:已经摆放完前i-1,且第i-2行与第...

2022-02-27 13:50:03 317

原创 327. 玉米田 (棋盘状压dp)

分析:限制条件:由于不能有公共边缘,并且只有在肥沃的土地上才可以种植,那么必须满足下面三种限制条件只能在肥沃的土地上种 不能 x>>i&1 && a[i][line]==0 同一列 不能连续种植 不能 x>>i&1 x>>i+1&1 同一行 不能连续种植 a&b==0初始化:0边界:dp[0][0]=1比较直观的is_valid()方法#include &l...

2022-02-27 11:55:13 223

原创 1064.小国王 (棋盘状压dp)

原题链接分析:一个棋盘状压dp问题,由于放置一个国王,国王不能攻击周围8个格子,那么一共有以下三种情况考虑上下 同一列相邻的位置不能放置国王 即(x>>i&1)&&(x>>(i+1)&1) 不能同时成立 考虑左右 同一行相邻的位置不能放置国王 即相邻两列状态 (a&b)==0 考虑四个顶点 也就是相邻两列的并集(a|b) 必须满足情况1维护的状态:当前列号,当前列的状态...

2022-02-27 11:08:18 212

原创 524. 愤怒的小鸟(重复覆盖,集合类状压dp)

524. 愤怒的小鸟 - AcWing题库关键:枚举所有的情况会超时,只需要枚举必要的中间状态,使得结果正确即可步骤:预处理出所有的抛物线 状态压缩dp分析:由于抛物线一定通过原点(0,0),任意两个小猪的坐标都可以组成一个抛物线开头向上 (a<0) 经过原点(0,0) 只有一个点时,可以看成直线同时,由于任意两个点之间是构成抛物线的,并且一条抛物线上可能有多个小猪一条抛物线上有多个小猪 两个点x不能相同,否则够不成抛物线那么,有两个点可以推出抛物线的公式...

2022-02-25 14:00:43 314

原创 P3694 邦邦的大合唱站队(集合类状压dp)

邦邦的大合唱站队 - 洛谷关键:由于是线性安排的,通过枚举所有M的选择情况+最后一个不同点,可以达到枚举M的所有摆放顺序分析:由于M的范围是1~20,所以想到用状压dp来做由于按照出队后,出队的偶像可以归队到任意的空位中,且我们需要同一乐队的偶像连续站在一起性质1:一队偶像安排到的位置可以是任意的,在他之前和之后的偶像都可以是任意的因为位置可能是任意的,那么我们可以先从头开始安排,一直安排到尾。因为我们是使用状压dp来做的,通过枚举所有 2^j (0<=j<...

2022-02-25 11:33:13 509

原创 291. 蒙德里安的梦想(状压dp)

291. 蒙德里安的梦想 - AcWing题库分析:由于数据范围是1~11,dfs会超时,可以想到状压dp核心:先放横着的,再放竖着的 总方案数=只放横着的小方块的合法方案数合法情况:没有填放小方块和没有前一行小方块延伸的位置,能够用竖着摆放的小方块填充满,就是空着的位置需要是偶数个当前列状态和前一列状态,同一位置上没有两个1 j&k==0 同一列连续空着的小方格是偶数或者0 j|k 是否合法由于第i...

2022-02-23 10:48:02 679

原创 1205. 买不到的数目(dp)

1205. 买不到的数目 - AcWing题库根据最后一个使用的糖果作为划分依据,可以划分出不重不漏的两个子集使用糖果1 使用糖果2#include <iostream>#include <algorithm>using namespace std;const int N=1e7+10;bool dp[N];int a[N];int main(){ for(int i=1;i<=2;i++) cin>>...

2022-02-22 17:31:00 103

原创 1022. 宠物小精灵之收服(二维背包,<m)

原题链接其实是一个普通的01背包问题,主要的坑点在于二维费用 有一维的费用条件是<m由于受到的伤害不超过m,可以先让m--,因为最后要求的是皮卡丘剩余的血量,皮卡丘可能是满血状态,所以枚举时候要从0开始枚举for(int i=1;i<=m;i++) for(int j=0;j<k;j++) if...

2022-02-21 16:53:13 506

原创 P1120 关路灯(区间dp,前缀和)

#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=55;typedef long long ll;ll p[N],w[N];ll dp[N][N][2];int main(){ int n,c; cin>>n>>c; for(int i=1;i<=n;i++) cin&...

2022-02-21 09:10:01 470

原创 CF 607B Zuma(区间dp,回文子串数量)

Zuma - 洛谷分析:运用分析元区间开始,逐步思考区间合并与状态转移方程len==1时,每个元区间被消耗时间都是1 len==2时,如果两个相等,消耗时间为1,两个不相等,消耗时间为2 len==3时,会有一个2区间和一个1区间合并(枚举中断点),如果左右端点相等,dp[i][j]=dp[i+1][j-1] ...通过上面的规律发现,分析图如下状态计算/子集划分:根据枚举区间大小,我们发现区间合并时由两个独立的,大小不一定相等的,子区间合并。所以,状态转移方程应该是枚举..

2022-02-21 09:06:32 214

原创 1058. 股票买卖 V(状态机模型)

原题链接#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=1e5+10;int w[N];int dp[N][3];int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>w[...

2022-02-18 21:50:38 155

原创 1057. 股票买卖 IV (状态机模型)

1057. 股票买卖 IV - AcWing题库#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=1e5+5;int w[N];int dp[102][2];int main(){ int n,k; cin>>n>>k; for(int i=1...

2022-02-18 21:30:11 180

原创 1049. 大盗阿福(状态机模型)

原题链接#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=1e5+10;int a[N];int dp[N][2];void solve(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i];...

2022-02-18 20:36:30 102

原创 P3146 [USACO16OPEN]248 G (区间dp)

[USACO16OPEN]248 G - 洛谷题意:每次合并两个 相同的,相邻的 元素,合并后的数值+1,求序列中合并后出现的最大数字的值是多少分析:其实可以很自然的想到了 区间dp,因为和石子合并有很多共同之处,只要在石子合并的基础上思考就可以了由于我们每次只能合并相同的且相邻的元素,那么对于不同的元素自然是不能合并的,我们可以在石子合并的基础上思考,把一个区间内的所有数合并成一个数字。剩下的就是区间dp了边界:len==1 dp[i][j]=w[i]初始化:全部初始化为0...

2022-02-17 13:50:20 444

原创 小小粉刷匠(区间dp)

原题链接可以看到本题和 涂色paint 的题目,只有一点不一样,就是本题限制了粉刷的长度,对于两个相同颜色的段,如果距离超过了k,那么就不能一起染色了一种解决方法是:特判如果距离超过了k,那么可以看成这两个是不同颜色,需要染色两次,使用涂色paint 题目中对待不同颜色的方法就可以了这里的枚举中断点:其实是枚举某个中断点,在中断点左边的染了一次s[i],中端点右边的染了s[j]枚举在哪里作为这个中断点比较好。(这里中断点分割开的两个子集:dp[i][k],dp[k+1][...

2022-02-17 13:00:37 317

原创 P4170 涂色(区间dp,两点+断点)

[CQOI2007]涂色 - 洛谷分析:首先可以想到是一个区间dp的问题,区间dp的问题的递推是从长度较小的区间一步步递推到长度最大的区间的,对于长度较小的区间,可以先模拟一遍可能的递推方式len=1时此时一定要染色,dp[i][j]=1len=2时 ,此时合并两个len=1的区间颜色相同时,dp[i][j]=min(dp[i+1][j],dp[i][j-1]); 颜色不相同时,此时的染色次数==2len=3时,此时合并一个len=1的区间,一个len=2的区间如果左右两个端点..

2022-02-17 11:48:54 582

原创 合并回文子串(区间dp)

原题初始化:全部初始化为false边界:lena+lenb<=1 初始化为1#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 55;bool dp[N][N][N][N];void solve(){ string a, b; cin >> a >> b; int n = ...

2022-02-17 11:12:37 292 1

原创 P3205 [HNOI2010]合唱队 (区间dp)

[HNOI2010]合唱队 - 洛谷分析:根据题意我们发现,小a每次排队的时候,会出现两种情况当前排入的人比初始队列中前一个人矮,排到最左边 当前排入的人比初始队列中前一个人高,排到最右边现在给定我们一个理想队列,然后根据这个理想队列推理出有多少种初始队列根据这个理想队列,其实我们可以发现,固定住一个点之后,初始队列在他后面的人,一定是不断加入到这个点左右两边的。所以固定住这个点之后,可以模拟不断向左向右加人,来获得理想队列。加人实际上就是一个区间左右端点的问题于是就可以从理想...

2022-02-16 20:09:09 574 2

原创 多个不相交子段和问题(状态机模型)

题意:给定一个数组,找出m个不相交的子段的和的最大值问题如果对于每个子段都必须是相连的(即每个元素都必须被选)的情况,状态可以如下定义这样子的时间复杂度是O(n^2m),如果要优化的话,可以维护一个maxn[i][j],维护一个前缀最值的数组,这样子的话可以优化到O(nm)如果对于一个元素可以不选的情况,可以如下定义,下面的定义也可以解决上面的问题for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { ..

2022-02-16 15:25:14 188

原创 1489. 田忌赛马 (贪心,区间dp)

题目:田忌赛马的故事,田忌每次输一局要付200元,赢一局获得200元,平局获得0元问,田忌和齐王都有n匹马的情况下,最多可以获得多少元1489. 田忌赛马 - AcWing题库由于田忌赛马的故事背景,我们很快就能够想到合理的贪心策略,上等马对中等马,下等马对上等马,所以可以将齐王和田忌的马都按照从大到小降序排序那么排序之后,对于田忌当前最大的马,如果比齐王最大的马还快,就用。如果田忌当前最大的马,如果比齐王最大的马还慢,就用田忌最小的马。证明: 当前都是按照降序排序,田忌目前的.

2022-02-16 13:41:08 939

原创 nc1033-小A的回文子串(环,区间dp)

原题链接由于是回文子串问题,首先要思考怎么进行回文字串问题的处理子串:连续的 子序列:不连续的对于子串可以采用类似子序列的方法边界处理不太一样初始化:全部为false边界:len==1 设置为true len==2且s[i]==s[j],dp[i][j]=true#include <iostream>#include <algorithm>using namespace std;const int N = 5010;bool dp[2...

2022-02-16 10:21:08 82

原创 1222. 密码脱落(区间dp,括号匹配)

可以看出是一个括号匹配/最长回文子序列的模板题初始化:全部定义为0边界:由于单个字符也算是回文子序列,dp[i][i]=1状态计算/子集划分:根据两端的字符是否在最长回文子序列中,可以不重不漏的划分成以下四个子集s[i]和s[j]均在回文子序列中 dp[i][j]=max(dp[i+1][j-1]+2) s[i]在回文子序列中 dp[i][j]=max(dp[i][j-1]) s[j]在回文子序列中 ...

2022-02-15 17:42:58 210

原创 734.能量石(贪心,背包)

一个能量石有自己的l,e,s,可以想到01背包问题,由于01背包是线性递推的,思考有没有一种排序的方法,能够使得我们能够贪心的获得最多的能量?可以想到邻项交换法,通过交换两个能量石,查看能不能推出关系式如图可以得到关系式,得到后排个序,做一个01背包即可#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=10...

2022-02-15 16:40:04 157

原创 321. 棋盘分割(二维区间dp)

321. 棋盘分割 - AcWing题库题意:一个矩阵可以横切,或者侧切,如图所示 对于被切开成两个部分的棋盘,可以且只能选择一个继续向下切求方差最小,由于均方差X固定,n固定,要计算的是被分成的子矩形的面积(xi-X)*(xi-X)。所以,可以采用搜索的方法,不断地枚举出最小值分析:二维区间dp,其实类似于数字三角形模型,由于分割可能不具有线性递推的关系,所以采用记忆化搜索的方法。横切i,分为两部分[(x1,y1)~(i,y2)],[(i+1,y2)~(x2,y2)]...

2022-02-15 15:57:57 566

原创 479. 加分二叉树(树上区间dp)

479. 加分二叉树 - AcWing题库分析:条件/性质:中序遍历 1,2,3...n 左右子树为空 ,积分=1 子树的积分=左*右+根根据中序遍历是1,2,3...n,可以分为以下的情况根结点=k,左边区间全部为l,右边区间全部为r,左右区间相互独立互不干扰那么,就可以转换为区间dp,石子合并的模型,寻找中断点作为根结点需要注意是子树为空的情况,子树为空时需要特殊考虑状态表示:dp[i][j]表示所有中序遍历顺序为i~j的集合递推顺序:1<...

2022-02-15 14:03:13 732

原创 1069. 凸多边形的划分(思维,区间dp)

限制条件:分为N-2个三角形 互不相交分析:由于一个三角形是需要三个顶点,我们可以先枚举三个顶点,然后观察一下有什么性质如图,当我们枚举出i,j,k三个顶点的时候,当前可以划分为三个集合左边的多边形集合+右边的多边形集合+当前的三角形这样子看就和能量项链很像了,通过枚举三个点,然后计算集合,由于需要先计算出所有的单个三角形的集合 然后 再递推到一整个多边形中的权值(枚举两个端点,至少中间间隔一个点,所以len为3,才能保证中间间隔至少一个点)所以len至多从3开始枚举...

2022-02-15 13:08:09 471

原创 320. 能量项链(环形,区间dp)

320. 能量项链 - AcWing题库分析:可以看成一个环形的区间dp问题一共有4个珠子,如图有四个标记,可以合并到最后只剩下2个标记,也就是1个珠子为止。那么最少是需要3个标记才可以继续合并,如果小于三个标记就不用再合并了。状态表示:所有合并i~j个标记的集合状态计算/划分依据:根据i~j中间的标记可以划分为不重不漏的j-i-1个集合,由于i,j表示的是标记,所以不能参与合并(dp[i][i]不是一个珠子,不参与运算,所以dp[i][j],j>=i+1)i+1作为...

2022-02-14 22:29:56 358

原创 1068. 环形石子合并 (环形,区间dp)

原题链接- AcWing分析:与石子合并只加了一个环形的条件对于环形问题,如果只是枚举中断点的话,在石子合并的基础上多开一维,时间复杂度是O(n^4)可以采用一个普遍的方法,就是把环转换成一个链通过把从1展开的链接在n的后面,这样子枚举的时候枚举以 位置2 断开的链,只需要枚举 以2开始,长度为len的链,就可以枚举n与1相邻的情况了状态转移方程基本和石子合并一样,不同点在于环的存在,导致循环枚举不同for(int len=1;len<=n;len++) ...

2022-02-14 21:45:00 299

原创 牛客寒假训练营 4 G(枚举优化,欧拉降幂)

由于是子序列问题,可以发现对于每个元素有两种选择,选或者不选所以一共可能有2^n种子序列,如果枚举所有的区间,并找出他们的最大值最小值,时间复杂度是O(n*2^n)因为每个区间只有最大值和最小值被使用到,所以我们只需要枚举最大值最小值就可以了,同时我们发现由于是子序列,不需要在意他的位置,因为作为最值位置可以任意,所以可以进行排序那么对于每一个点来说,有作为最大值的所有情况和作为最小值的所有情况,因为是乘积,就可以单枚举出他作为最大值的次数 p,得到和作为最小值的次数q,得到,而不用在意与他..

2022-02-14 16:25:39 147

原创 282.石子合并 (区间dp)

运用区间dp的思想来思考状态表示:所有合并第i堆到第j堆果子的集合属性:min状态计算/子集划分:上一次合并了哪两堆果子,即上一次的中断点是哪中断点在i+1 合并[i]和[i+1,j] dp[i][j]=dp[i][i]+dp[i+1][j]+sum[i,j] 中断点在i+2 合并[i,i+1]和[i+2,j] dp[i][j]=dp[i][i+1]+dp[i+2][j]+sum[i,j] ... 中断点在j-1 合并...

2022-02-13 22:19:55 230

原创 牛客寒假训练营 4 C (差分)

原题链接由于数据范围是 1e5,然后每个彗星出现的时间都是一段区间,其实可以想到差分的思想运用差分对一段区间快速的修改,最后前缀和一下本题的思路就是定义一个时间轴,对于红彗星,蓝彗星分别存储,每次出现都对区间进行一次修改,最后就可以看出一段区间是不是有彗星出现#include <iostream>#include <algorithm>using namespace std;const int N = 2e5 + 10;int a[N], b[N];...

2022-02-12 23:03:22 213 1

原创 牛客寒假训练营 4 J (最小公倍数,数论)

原题链接因为有3e4个数据,如果用欧几里得算法求所有合数的最小公倍数会爆longlong由于任意数都是最小质因数的指数的乘积。所以最小公倍数其实是[l,r]这个范围内的所有合数构成的每个质因数的最大指数的乘积。也就是说[l,r]范围内所有质因数的最高次幂的乘积因为,我们可以得出,最大公因数就是所有合数共同的最小次幂的乘积代码如下#include <iostream>#include <algorithm>using namespace std;...

2022-02-12 22:37:29 242

原创 200. Hankson的趣味题 (约数角度求公因数)

1

2022-02-12 10:58:43 200

原创 220. 最大公约数 (欧拉函数)

220. 最大公约数 - AcWing题库gcd(x,y)=p, p表示一个素数,等价于gcd(x/p,y/p)=1,表示x/p和y/p互质要求gcd(x,y)为素数有多少对,等价于求gcd(x/p,y/p)=1有多少对这样子其实就变成了201. 可见的点 - AcWing题库的模型,只需要做一遍欧拉函数,求出对应的phi数组就可以了。由于我们不知道素数p是多少,需要枚举一下p,然后求对应有几对那么可以用前缀和优化,s[i]表示1~i中,欧拉函数值之和,然后+上2*s[i] (...

2022-02-12 00:55:28 430

原创 201.可见的点(欧拉函数)

201. 可见的点 - AcWing题库我们发现,任意两个 x,y <=N 内,每个斜率都只有一个点是可见的我们可以发现,一个斜率 y/x 最先被发现的点(x,y),他的x,y是互质的那么,以斜率为1的点作为分界线,坐标(x,i) (1<=i<=x),所有第一个被看见的点的i都是和x互质的,等价于求1~x有多少个数与x互质,那么就变成了欧拉函数的定义,筛法求一遍欧拉函数就可以了由于 上半部分 和下半部分完全对称,那么就不需要做了,只需要*2就可以了#incl...

2022-02-12 00:43:27 7012

原创 198. 反素数 (约数个数)

198. 反素数 - AcWing题库反素数:对于g(x),1~x-1的所有数i,他们的g(i)<g(x),那么x是反素数目标:寻找约数个数最多的,且不超过N的最大的反素数分析:由于反素数的定义是,比x小的数约数个数都要比他小,不能相同,我们可能很显然的想到,是要求一个不超过N的,约数个数最大的且值最小的数由于这种性质,我们每次选用最小质因子的时候都会优先选择比较小的质数,那么根据质数的前缀乘积,我们只要列到23就可以了。同时,由于要约数个数最大,那么约数的个数就等于 (2的...

2022-02-11 23:56:55 6793

原创 1294. 樱花(求约数)

原题链接 - AcWing分析: 思考怎么进行优化,就是找出一个特殊的性质,由于看到了n!,可以想到197. 阶乘分解 - AcWing题库这道题,并且看到了数对数量,可能是和约数的个数是有关的限制条件:x,y必须是正整数 满足 1/x + 1/y =1/n!那么可以通过这两个限制条件来转化一下模型,过程如下那么我们需要计算(2*n...

2022-02-11 22:35:35 147

原创 1291.轻拍牛头 (计算约数)

轻拍牛头 - AcWinge约数-->倍数,两者可以相互转换分析:直接判定两个数是否一个是另外一个的约数的话,时间复杂度是O(n^2)这样之间判定的时间复杂度太高了,可以从数组中一个数的角度出发,染色他所有的约数,由于染色约数这个操作不是很好操作,因为c++是向下取整的,我们一般转化为倍数逆向思维一下,一个数是数组中其他数的约数的话,那其他数就是这个数的倍数,所以我们可以去一个数中所有的倍数for(int i=1;i<=n;i++) { int...

2022-02-11 20:32:13 7034

原创 1290. 越狱 (逆向思维)

分析:正向很难考虑,考虑逆向逆向:有m种宗教,n个犯人犯人所有宗教信仰的情况:m^n (m*m*m*...一共n次)犯人宗教信仰不会越狱的情况:第1个犯人可选宗教数为m 第二个犯人可选宗教数为m-1(左边选了什么,当前不能选...)综上:所有会发生越狱的情况=所有情况-不发生越狱=m^n-(m*(m-1)^(n-1))#include <iostream>#include <algorithm>using namespace std;con..

2022-02-10 11:17:37 271

空空如也

空空如也

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

TA关注的人

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