摘要:原题: 思路: 莫队 统计的是各个数字的个数 如果说加的时候,sum==1,则颜色种类数++ 减的时候,sum==0,则颜色种类数-- 但是要注意由于区间排了序,所以要用一种方法来保证顺序不出错。 很简单看代码吧 代码: #include <bits/stdc++.h> using namespac
阅读全文
摘要:原题: 思路: 区间动规处理有一个十分明显但你他妈就没发现的特征:大区间包含小区间,大范围解包含小范围解 这个题符合这个特征,所以是区间动规 f[i][j][0]表示的是第i人从左边进来的方案数 f[i][j][1]表示的是第j人从右边进来的方案数 假设第三维是0,则前面那个一定比他高,前面的人就必
阅读全文
摘要:原题: 思路: 一说到区间操作的最少次数,我就想到了区间动规 首先,对于每个长度为1的区间,次数显然是1 第二,对于左右端点颜色相等的情况,显然只要要在之前涂色的时候一起涂上就行 第三,对于不相等的情况,就只能按照一般区间动规处理 这道题帮助我解决了带特判的动规姓“搜”还是姓“动”的问题解放了思想可
阅读全文
摘要:原题: 思路: 状压DP经典题目 对于每一个点是否可以放部队 只要考虑前两行有没有部队 这一行有没有两个部队距离在两格之内 这个点是不是山 即可 状态转移方程: dp[L][S][i]=max(dp[L][S][i],dp[FL][L][i-1]+Sum[S]); 搭配一些二进制处理 在输入地图的时
阅读全文
摘要:Bellman-Ford算法 求最短路的 这个算法基于一个叫做“松弛”的操作 松弛会试图往最短路中加边来缩短最短路 对于这样一个图 1到3的最短路显然是1→2→3而不是1→3绕远路就是最短的捷径 我们所进行的松弛操作就是这样的 松弛时枚举每一条边,并判断先走最短路到达这条边的u点,再经过这条边到达v
阅读全文
摘要:原题: 思路: 经典DP题目 但这个题有个更快的做法 开一个数组d表示序列中的数 如果目前这个数与d中最后一位符合要求 就加入 如果不符合就找到d中第一个不符合要求的并替换 相当于一直在确定这个序列是多少 详见代码 代码: #include<bits/stdc++.h> using namespac
阅读全文
摘要:原题: 思路: 考虑DP 设f[i][j]为考虑前i行,第i行选第j个的最大值 则f[i][j]=max(f[i-1][j])+d[i][j] 这道题由于有枚举成分在,如果用DFS就会超时 代码: #include <bits/stdc++.h> using namespace std; int n
阅读全文
摘要:原题: 思路: 可以采取类似于树形DP的做法 计算出从各个儿子到达目标点的方法 然后加起来,就是这个点的方法 就像是反向的计数DP 代码: #include <bits/stdc++.h> using namespace std; struct node { int u,w,nxt; }e[2000
阅读全文
摘要:原题: 思路: 考虑搜索,显然有必胜策略 对于能转移到必胜状态的,必输,因为它把必胜状态给了对方 由此可以用搜索解决 但是DFS麻烦,于是我们换一种策略 类似动规 代码: #include <bits/stdc++.h> using namespace std; int n; int f[2010]
阅读全文
摘要:原题: 思路: 经典树形DP 借此题讲解一下树形DP 顾名思义,树形DP以「子树」作为单位进行DP 由于这个性质,DFS成了实现的最好选择 先DFS求出子问题,随后得出当前规模答案。 详见代码 这个还可以用拓扑排序做 代码: #include <bits/stdc++.h> using namesp
阅读全文
摘要:2020-08-08 搜索要真正的覆盖所有情况, https://www.cnblogs.com/lujin49/p/13453437.html是一个悲伤的故事 2020-08-27 莫队要注意顺序
阅读全文
摘要:原题: 1≤n≤16 思路: 一看规模,暴搜,这种题还不简单hahaha 既然要做题,我们就要想想更优解法 为什么不写一下记忆化呢? 首先我们想到的是,记忆以每一个单词开头能得到的最长长度 但是这个想法连样例都过不了 在这组样例中,以我们的想法,OIOOI显然能接的最长单词是IUUO 但以IUUO开
阅读全文
摘要:原题: 思路: 首先考虑暴搜。 对于每一个点,我记录到这一格为止,走过了多少路。然后枚举四个方向继续递归。直到彻底走不动之后,就停下来更新答案。 但是有个问题——数据规模最大100行100列,如果我以一次递归4个方向来计算,第一层4种,第二层16种,第三层64种,第四层256种,而假设我们从整个地图
阅读全文
摘要:原题: 思路: 显然是搜索 但问题在于要同时标记行、列、对角线 对角线有规律:从左上到右下,x-y是固定值,从左下到右上,x+y是固定值 由于x-y有可能是负的,所以要+n 代码: #include <iostream> using namespace std; int n,ans,book[233
阅读全文
摘要:原题: 思路: 广搜。 但队列除了记忆坐标,还要记忆步数。 在将一个点入队的时候,这个点的步数为这个点的父亲节点的步数+1,顺便把答案设了。 代码: #include<bits/stdc++.h> using namespace std; int n,m; int sx,sy; int a[405]
阅读全文
摘要:原题: 思路: 对于每一个楼层,只有上和下两种情况 将上和下分别入队跑BFS即可 代码: #include<bits/stdc++.h> using namespace std; int n,a,b; int move_count[205]; bool arrived_floor[205]; boo
阅读全文
摘要:2020-08-06 搜索与动态规划有一个共同特点,它要覆盖所有情况。其中记忆化搜索与动规又有同样的特点,在覆盖所有情况的同时有大量的重复计算。 在设计状态时(不论搜索还是动规)要保证覆盖所有状态(动规还要保证有重复) 2020-08-07 拓扑排序给出了动态规划的求解顺序,被取出的点是已知的,没有
阅读全文
摘要:原题: 思路: 数据范围很小(n<=20)所以考虑搜索。 最为朴素的想法——对于每一个单词,我考虑后面能接哪些单词,并分别尝试计算答案。 但是随之而来的就是一个问题——我要如何知道后面能接哪些单词? 解决方法很简单,只要匹配一下就好了。 但是,难道我每次递归,都要匹配一下吗?这肯定是不行的,时间复杂
阅读全文