
luogu
会飞的蟋蟀
学习中!!
展开
-
luogu P1019 单词接龙
解析一道dfs题,但是坑在题意不清,实际是求最短重叠词段,我一开始求成了最长的(直接增大了难度…)。 主要就是两个部分,dfs和concate,dfs遍历构造出来的搜索树,concate计算重叠长。 tips: 为什么这是道搜索题?答:以一个词开始(根节点),依次考虑数组中的词能否连接(分支),算最长词长。 代码修改了一下,比较简练了#include <iostr...原创 2018-03-26 14:12:40 · 251 阅读 · 0 评论 -
luogu P1282 多米诺骨牌
题解线性dp,需要一点理解。可以类比背包问题,此时的状态不是背包容量而是差值。 f [i][j]:代表对前 i 个牌在 j 的差值下 最小的翻动数。 有递推式 f [ i ] [ j ] = min( f [ i - 1 ] [ j - (a[i]-b[i]) ]+1 , f [ i - 1 ] [ j - (b[i]-a[i]) ] ) a[],b[] 为上下牌面数ps: 显然 ...原创 2018-08-17 19:47:09 · 140 阅读 · 0 评论 -
luogu P1080 国王游戏 【模版】
题解这题一开始我想歪了。对每个大臣而言,显然排在队尾是能拿到最多钱的,所以我以为只要考虑n个大臣排在队尾 的情况就足以覆盖最大的所有情况了。 问题是什么呢?就是我考虑的是每个大臣能拿到的最值情况,但并不是所有排列下,该排列的最值情况。 就是说在某种情形下,排在队尾的大臣确实拿到了比其他任何排列情况都要多的钱,但是他不是该排列下 的最值。 所以这道题其实是要找到一种能够让这个队列所有成...原创 2018-08-27 16:50:28 · 372 阅读 · 0 评论 -
luogu P1233 木棍加工
题解这道题很像之前做过的导弹拦截的题目,关键点是偏序集。 显然答案就是这个二维数集合的最少链划分数,也就是最大的反链长度 (根据Dilworth定理)。 但是直接求反链还是难。 咱们先对其中一维由小到大排序,再对另外一维被固定的数,考察其非降序情况即可。 我看了一些贪心的做法也是可行的。ps: 再次出现 bus error。 在sort()中必须要用严格升序,参见std::sort...原创 2018-08-27 20:21:25 · 250 阅读 · 0 评论 -
luogu 高精度加减类型 【模版+】
总结这次是没有具体的题目了,就是单纯地完善了上次的高精度的模版,支持了正负数加减。Code// head files excludedusing namespace std;const int N = 15000;struct BigInt{ int data[N]; int size; // size域 显式声明 bool nega;// 记录符号...原创 2018-08-28 12:44:20 · 179 阅读 · 0 评论 -
luogu P1006 传纸条
题解一道矩阵dp的升级版,难在来回两次怎么办? 想想可知来回其实就等价于走两次,怎样表示走两次呢?这又是个问题。 走一次的所有阶段和状态可以由二维数组解决,那么两次是不是可以用四维数组搞定呢。没错就是这么暴力。 定义 F [ i , j , k , q ] 为 第一走到[ i , j ] 第二走到[ k , q ] 时最大的积累值那么就有状态转移方程 F [ i , j , k ,...原创 2018-08-24 11:36:49 · 148 阅读 · 0 评论 -
luogu P1582 倒水
题解一开始很容联想到二叉树的结构,初始的杯子数就是子节点,两个相邻子变父,这样不断往上走。 当然其实和树没有什么关系只是可以形象化理解。 容易知道任何 2^k个水杯都可以最后合成 1 个,那么我们只要不断地对现有的杯子求 <= 当前杯子数的 2^k,然后n减去2^k,这表示这么多的杯子可以合成一个,所以再 k–,如此往复直到 k==1,这时所剩 的杯子数目 n 就必须想能办法合成...原创 2018-08-29 11:55:57 · 137 阅读 · 0 评论 -
luogu P1541 乌龟棋
题解难得做出一道dp题,虽然方法不是最好的,但记录一下思路,方便和大佬的比较一下。 这题有点像背包,但不一样的地方在于 背包问题中背包的价值和放的位置无关,本题中顺序会影响其价值。 显然所有的顺序都要被考虑。 这里简要给出我的思路: 设有 F [ pos , i-j-k-t ] ,表示到达第pos位置时候以 i-j-k-t (四种卡片消耗数量)此情况 能够取得最大价值。 每到一个...原创 2018-09-04 14:58:17 · 106 阅读 · 0 评论 -
luogu P1052 过河
题解一道难点不在于dp的dp题目。转移公式很简单for( i = 1->n ) for( step = s ->t ) f[i] = min(self, f[i-step] + v[i])// v[i]:在i处有无石头我脑子比较抽用的max()来递推的,其实也一样。 但是这条路有 1e9 长,直接下去是肯定超内存又超时的,必须要想办法把无用的路...原创 2018-09-04 21:15:02 · 144 阅读 · 0 评论 -
luogu P1538 迎春舞会之数字舞蹈
题解看到别人都用了什么结构来存储,我就比较简单粗暴了,直接按 行 - 字 - 列 的顺序依次考虑输出对象。 想清楚了其实不难,就是稍微繁杂了点,有点像小学奥赛题…Code#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#inclu...原创 2018-09-02 15:19:58 · 330 阅读 · 0 评论 -
luogu P1058 立体图
题解可以说是很烦的题目了。硬写是基本做不到的,存在遮挡的问题,人肉考虑无比繁琐,反正我是放弃了。 可行的做法是,准备好一个健全的方块,以及一个画布 (char canvas[][] ),然后一个一个画上去copy。 亮点是如果按照一定顺序画的话,后画的能恰好实现遮挡前面的。是不是很巧。Code#include <iostream>#include <cstd...原创 2018-09-11 17:35:37 · 391 阅读 · 0 评论 -
luogu P2158 [SDOI2008]仪仗队 【模版】
题解数论类型的题目,一头雾水。第一次见到欧拉函数,这里记录一下。Code筛法/*特性 :1.若a为质数,phi[a]=a-1;2.若a为质数,b mod a=0,phi[a*b]=phi[b]*a3.若a,b互质,phi[a*b]=phi[a]*phi[b](当a为质数时,if b mod a!=0 ,phi[a*b]=phi[a]*phi[b])*/int m[n...原创 2018-09-06 10:55:31 · 249 阅读 · 0 评论 -
luogu P1338 末日的传说
题解本质就是算逆序对数。 n个降序排列的数能提供 (n-1)*n/2 个逆序对,这是n个数能创造出的最多逆序对数。 那如何排列出任意m个逆序对呢? 显然第一步是找出能覆盖 m 的最小 n 来,即 (n-1)*n/2 >= m。 n 能覆盖,那么 n-1 就不能覆盖 m,而 m 与 n-1 的覆盖 之间的差值 dis = m-(n-1)*(n-2)/2,如何填补? 这个差值 d...原创 2018-09-06 11:35:54 · 167 阅读 · 0 评论 -
luogu P1095 守望者的逃离
题解这题我当作贪心来做了,看大佬们用dp用得很6啊,肥肠羡慕。本题核心思想: 在一段时间内移动尽可能多的位移,最大化时间效率。妥妥的贪心。大体思路:蓝充裕(m>=10)的时候肯定瞬移最快 60m/s,在蓝不够的时候有可能等回蓝再瞬移更快,也可能直接走更快。 这取决于剩余的时间。 代码中列了一个表,人肉算出来的是对 1-6s 时能够产生的最大位移。为什么只算到6s呢?因为以后的...原创 2018-09-12 13:20:59 · 131 阅读 · 0 评论 -
luogu P1736 创意吃鱼法
题解f [ i , j ] 代表以 i-j 为末端的最长值,显然依赖于f [ i-1 , j-1 ] 和 f [ i-1 , j+1 ] 即左上右上。 但左上右上可取到是有前提的,即左右上三个方向恰好有多于 f [ i-1 , j-1 ] 和f [ i-1 , j+1 ] 长度的空格。 那么我们用s1[ i , j ] s2[ i, j ] 来记录再 i-j 位 左右以及上方向有多少...原创 2018-09-12 15:23:41 · 113 阅读 · 0 评论 -
luogu P1880 [NOI1995]石子合并
题解第一次遇到区间dp的问题,这种解构问题的方法还是比较新颖的。 既然是dp,我们还是想要把全部的状态以及选择表达出来,怎样表示是个问题。大概思路是//mst(dp,0) 初始化DP数组for(int i=1;i<=n;i++){ dp[i][i]=初始值}for(int len=2;len<=n;len++) //区间长度for(int i=1;i&...原创 2018-08-22 14:29:37 · 276 阅读 · 1 评论 -
luogu P1140 相似基因
题解这题和那道经典的最长相同子序列很类似,是一道简单的(?)线性dp。 仔细思考一下什么是状态,选择以及相互之间的影响。 F [ i ] [ j ] : 代表 i,j 位置为止的两段串的最大分数 转移方程 // 显然就3种选择 i,j配对 i不配对 以及 j不配对F [ i+1 ] [ j+1 ] = max{ ...原创 2018-08-22 10:57:04 · 152 阅读 · 0 评论 -
luogu P1605 迷宫
解析一道dfs题,入门级的深度搜索,很简单。注意原地打码即可。代码#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;typedef pair<int,int> P;int...原创 2018-03-27 21:59:26 · 245 阅读 · 0 评论 -
luogo P1219 八皇后
解析八皇后问题是非常经典的搜索问题。大体思路是依据每行考虑可行列来dfs,但是随着N(行数)增大, 递归的次数会膨胀。所以需要一种合适的精简快捷的判断可行列的方法,这里采用标记数组的方法: 选用3个数组(用check[3]表示),check[0]标记垂直方向,check[1]标记/左下斜方向,check[2]标记 \右下斜方向。 tips: 为什么 i+j ,i-j+n 可以表示斜标记呢...原创 2018-03-28 21:43:55 · 803 阅读 · 0 评论 -
luogu P1141 01迷宫
题解这道题有点特点,看似是bfs 其实真这么做 最后会LTE。 关键在于发现 同一联通块内的点 其可到达的点数是一样的 然后这就变成了求联通块并计数的题目了。代码#include <iostream>#include <cstdio>#include <fstream>#include <cstring>#includ...原创 2018-06-05 16:59:09 · 173 阅读 · 0 评论 -
luogu P1049 装箱问题
题解待写。。。代码#include &amp;amp;lt;iostream&amp;amp;gt;#include &amp;amp;lt;cstdio&amp;amp;gt;#include &amp;amp;lt;fstream&amp;amp;gt;#include &amp;amp;lt;cstring&amp;amp;gt;#include &原创 2018-05-30 20:31:16 · 116 阅读 · 0 评论 -
luogu P1057 传球游戏
题解用二叉搜索肯定是对的但是超时。这里给出一个dp的解法f[pos][t] = f[pos-1][t-1] + f[pos+1][t-1] pos: 位置 t: 步数 f[][]: 表示在此位此步存在的解法数代码#include <iostream>#include <cstdio>#include <cstdlib>usi...原创 2018-07-18 11:37:59 · 178 阅读 · 0 评论 -
luogu P1115 最大子段和
题解最大子段和是个比较经典的算法题,解法很多。 这里给出一个O(n)的解法,自己想的比较直观: 设max_sum为最大累计和 cur_sum为当前累计和,要想获得最大的连续和,显然要尽可能保持cur_sum为正数, 试想如果为负,那么接下来加上什么数字都是减少的。 对此时处理的位置(不妨设为num[i]),如果cur_sum为正数且cur_sum+num[i] &gt; 0 , 那么...原创 2018-07-22 10:57:48 · 163 阅读 · 0 评论 -
luogu P1160 队列安排
题解很简单的一道链表插删操作,用stl做会超时,后来自己写了个结构模拟了一下。 小技巧:这题的删除不用真删,用个布尔表mark一下就好了ps: 还可以用树来做,中序遍历。代码#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>...原创 2018-07-22 13:54:35 · 152 阅读 · 0 评论 -
luogu P1091 合唱队形
题解这道题有点意思,是一道有点变化的dp。这题的基础是那道最长递增序列。 简单的解题想法是对表中每位考虑 从左到此 最长序列多少,从此到右 最长序列多少。最后相加取最大值即可。代码#include <iostream>#include <cmath>#include <cstring>using namespace std;int n;...原创 2018-07-31 17:23:49 · 113 阅读 · 0 评论 -
luogu P1020 导弹拦截
题解这是一道需要加深理解才能ac的题目。 第一问 就是求最长非递减序列(倒序)的长度,用dp解很容易但是只有O(n),要优化到O(log n)需要一点高级的数据结构帮忙。 第二问 想了很久 发现用naive的屡次去除最长序列的方法失败。看了下大佬的解答, 发现了一个全新的定理 DilworthDilworthDilworth定理。这是一个离散数学里的知识点。 大意是讲 在一个偏序集合中...原创 2018-08-10 16:58:25 · 193 阅读 · 0 评论 -
luogu P1088 火星人
题解这道题用stl的next_permutation可以妙解,但是如果不让用你能不能想到别的方法呢? 这道全排列让我想起了那道著名的 八数码 的题目,里面有一种用阶乘做hash的方法,非常牛逼。 那种方法的学名叫做康托展开,可以把全排列的各种排列与自然数 实现一一映射。 有这个武器,这题的思路就很明显了,把给出的排列 康托展开 得出映射数 再加上增加值 再做逆展开。值得注意的是,这道...原创 2018-08-15 09:55:26 · 207 阅读 · 0 评论 -
P1434 [SHOI2002]滑雪
题解比较简单的记忆化搜索,存储在此位置的最长距离,便于其他位置计算。Code#include <iostream>#include <cstdio>#include <fstream>#include <cstring>#include <cstdlib>#include <cmath>#inclu...原创 2018-08-08 11:58:30 · 333 阅读 · 0 评论 -
P1118 [USACO06FEB]数字三角形 Backward Digit Su
题解可以递推出初始的系数组,然后遍历所有的排列并计算就可以了。 用stl会超时,需要优化。我们在计算累乘的过程中 若发现此位置算上后 cur_sum已经大于目标sum时 那么在对后面的数做permutation就无用了 全部都会大于sum,所以可以直接跳过。 跳的方式是 把第i位到末尾的数全部从大到小排序,那么下次permutaion就会改变当前i位。 这是根据permutaion的计...原创 2018-08-08 13:34:41 · 154 阅读 · 0 评论 -
luogu P1226 【模板】快速幂||取余运算
题解快速幂模版题。 看了一下很好理解,就是把幂 化成 二进制 逐位累乘。 见实例: 2^11 = 2^(1011) = 2^(8+2+1) = 2^8 * 2^2 * 2^1Code#include &lt;iostream&gt;#include &lt;cstdio&gt;#include &lt;cstdlib&gt;#include &lt;cstring&am原创 2018-08-08 15:01:05 · 227 阅读 · 0 评论 -
luogu P1010 幂次方
题解这是一道只要理解了递归就应当能做出来的题目,比较简单,注意加号怎么加。Code#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>u...原创 2018-08-08 16:21:00 · 157 阅读 · 0 评论 -
luogu P1955 [NOI2015]程序自动分析
题解并查集+离散化。这题并查集使用起来有个小trick,就是先把e=1的先合并再考虑e=0的,这样可以回避掉因为顺序不一导致的又合又分的情况。第一次碰见离散化。大意是把大范围数转化为小范围的数,转化方法是根据其在原数组内的相对位置。例如{ 9783, 123 , 31342432, 231324 }->{ 123, 9783, 231324, 31342432 }->...原创 2018-10-17 11:54:10 · 121 阅读 · 0 评论