摘要:原题: 思路: 让求个序列 还得是中间高两头低的 还得是最长的 你说要是让我求个最长增还行 最长减也可以,毕竟就是反向最长增 你要我求这个玩意?? 不对,仔细一看,这不就是最长增和最长减拼在一起 从1-n求个最长增,再n-1求个最长增 再枚举“拼接点”,计算即可 代码: #include <bits
阅读全文
摘要:原题: 思路: 有那么一瞬间,我以为我在做数学题 思考一下,我们会发现这样一个问题 根据题目的描述,我们可以知道,小车从某个时间开始接球,到某个时间不再接球 这期间所有的球都可以接到(因为是匀速的) 那么我们只要找出那个开始和结束的时间点,算出有效距离,求出个数即可 代码: #include <bi
阅读全文
摘要:原题: 思路: 左右两方向的处理 事实上这类题全部都是可以转换为“从左向右”的处理的 再回来考虑这道题 我们发现它要求我们让每堆纸牌都变成平均数 那我们可以先把它算出来,因为肯定要用 其次,由于牌堆数目参差不齐,所以我们为了将它们捋平,要对每一个数i做一个差分diffi 然后根据这个diffi,我们
阅读全文
摘要:原题: 思路: 事实上,这道题给定的是区间定长以及区间的左端点。 思路的话,接近于“一维扫描线” 从第一个端点开始,向下一个端点跳跃,并计算跳过了多少距离 如果是左端点,压栈 右端点,出栈 仅在栈不为空时计算距离
阅读全文
摘要:原题: 思路: emmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm 这玩意儿不就是一个深搜解决? 一看难度,绿的 行吧看来我把它想简单了 而且深搜确实有些问题 就题面来看,如果进行深搜,就意味着我们要不断地访问同一个点 浪费时间啊 能不能一次求出呢? 思考过后我们发现,显
阅读全文
摘要:原题: 思路: 似乎并没有专门解决这类问题的高效算法,一看规模就更加确定做法是偏向暴力的了 看这道题,实际上就是给一个数列,然后要求数列内每两个相邻的数相加不大于x,问要减去多少 实际上,我们可以看到,每一个数都能影响两个相邻的组合,它前面的和它后面的(除了第一个和最后一个) 既然如此,这个处理就很
阅读全文
摘要:原题: 思路: 没啥思路 已经把思路贴我脸上了 求逆元 这玩意是很重要的东西,一旦涉及到除法取模,就要用逆元转化成乘法来取模 原因是: (a+b) mod c=((a mod c)+(b mod c))mod c (a-b) mod c=((a mod c)-(b mod c))mod c (a*b
阅读全文
摘要:原题: 思路: 这是我一辈子达不到的文采 好现在思路来了 实际上这个题的意思就是: 求一段固定长度的区间使得总和最大 区间和,没有修改,一看数据还可以,那当然是前缀和啦 在输入数据的时候,在代表天空的数组的对应位置+亮度 然后处理前缀和 再然后遍历区间右端其实无所谓根据W永远是奇数你甚至可以遍历区间
阅读全文
摘要:题目: 思路: 一看,计数的 先考虑一下DP 计数的转移,难度高的一般要经过思考才能得出来 但是难度低的(诸如此道)一般已经在题目中说出来了 重点就在于: 每个同学可以把球传给自己左右的两个同学中的一个(左右任意) 这句话上。 左和右,换成数学表示就是 i-1,i+1 由于题目说是一个环,所以特判一
阅读全文
摘要:题目: 思路: 经典的背包题目 不过比较特殊的是,体积即是价值 求出最大值来之后减去背包容积即可 代码: 没有,太简单了
阅读全文
摘要:题目: 思路: 背包没跑了。 典型的背包题 借此来讲讲背包 最优化的一维背包采用剩余体积作为划分的依据 同时运用滚动数组反向遍历来实现 重要的几个标志: 价值,体积,最值 代码: #include <bits/stdc++.h> using namespace std; int f[1005]; i
阅读全文
摘要:题目: 思路: 我们考虑一下,这道题有哪几个因素能够确定一个状态? ——栈外元素数与栈内元素数 为什么? ——我们考虑一下 栈内元素个数是容易想到的 那么为什么第二维是栈外元素个数? 实际上,在这道题中如果不用它也可以,例如换成栈顶元素 但是这会导致转移极其麻烦 而在使用栈外元素的情境下就变得十分简
阅读全文
摘要:题目: 思路: 这题在一个细节上很奇怪,它给树是按中序遍历给的 而且只给了中序遍历 这意味着我们可以通过自己的方式来构造这棵树 我们回想一下—— 在中序遍历中,一个根节点的左儿子是? ——这个节点的左边所有 右儿子是? ——右半部分 如果用区间表示呢? ——[i.k-1],[k+1,j] 为什么没有
阅读全文
摘要:题目: 思路: 记住那两句话: 1.反向思维 2.区间动规的特点在于,大区间包含小区间,小区间推导出大区间 然后我们来看 首先我们可以发现各行是互不影响的,所以可以分开 其次,不管怎么操作,这个序列会变小,而且是连续的 虽然它是取数,但同时对区间造成了影响 于是我们就可以想想方程了 f作为某一行的和
阅读全文
摘要:题目: 思路: 我拿过这题一看,方格,下&右 好又是这种,和过河卒差不多 不过这题有点特殊: 1.能走两遍,前一次的路对后一次有影响 2.与过河卒相比,它不是计数,而是求最大值 但是本质上都是一样的 对于第一点,我们可以用多线程的方式解决,也就是同时处理两条路径 对于第二点,无非就是将加法换成了求m
阅读全文
摘要:原题: 思路: 显然是计数DP 又是在网格上,又是只能走下和右,思路是很显然的 想要到达这个点,只能由这个点上方和左方的点转移来 方程也很明显了: f[i][j]=f[i-1][j]+f[i][j+1]; 注意特判被马占的点就可以了 代码: #include <bits/stdc++.h> usin
阅读全文
摘要:原题: 思路: 莫队 统计的是各个数字的个数 如果说加的时候,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]); 搭配一些二进制处理 在输入地图的时
阅读全文