随笔分类 - ACM
大二到大三不堪回首的记忆....
摘要:原题链接 考察:区间DP 思路: f[i][j]表示[i,j]区间的最大得分,那么状态转移方程f[l][r] = max(f[l][r],calc(f[l][k],f[k+1][r],op[k+1]) calc函数是什么呢,根据定义f[i][j]表示i,j区间合并后的最大得分,calc就是再将f[l
阅读全文
摘要:原题链接 考察:区间DP 处理方式略像涂色...本蒟蒻是没想出来怎么转移.... 思路: 实际就是暴力...本蒟蒻还想了怎么快速判断循环..... 对于枚举的区间[l,r],看是否是循环区间,如果不是要再看里面的子区间是否为循环区间,枚举子区间f[l][r] = min(f[l][k]+f[k+1]
阅读全文
摘要:原题链接 考察:区间dp 这题就是一维的棋盘分割. 思路: f[i][j][k]表示将[i,j]区间分为k份得到的最大值.与棋盘分割不同的是,这道题是一维的,所以我们可以只枚举选上半边就可以枚举到所有方案.也可以枚举选下半边,但是注意这道题要预留足够的空间给进一步选择的上半边和下半边,因为memse
阅读全文
摘要:原题链接 考察:区间dp 这题好像HDU 4283 可以往左或者往右走.但是这道题起始位置不确定,也就是说,i位置不一定是栈底. 非常详细的题解 思路: 因为题目完全不一样,所以必须换一个思路.以f[i][j]表示灭掉[i,j]所有灯消耗的功率.首先明确老张灭灯只要路过了就会灭,因此最后的位置要么是
阅读全文
摘要:原题链接 考察:区间dp 思路: 这道题和凸边形的划分很像,枚举中间点,两边成为独立的两部分.只不过这题可以横,纵着切,所以是两个方向的区间dp.对于一块矩形板,我们选了上面,下面与平均值的标准差就确定了,快速求解矩阵和可用二维前缀和预处理.因为要用到二维,所以是五维转移方程f[x][y][a][b
阅读全文
摘要:原题链接 考察:状压dp+dfs寻找路径 思路: 重复覆盖问题.参考愤怒的小鸟的思路,我们需要两两构造一个包含两个字符串a,b的DNA序列,然后要分a在前面与b在前面两种情况. 本蒟蒻一开始想的是定义结构体String,再定义结构体内部的st(二进制标记哪些串被标记),构造后的具体字符串s.每个状态
阅读全文
摘要:原题链接 考察:状压dp 这也能状压?果然是我太弱了. 思路: 很容易想到压缩相同的数字,采取最暴力的做法就是将m个数字全排列计算代价的最小值.时间复杂度是O(m!)会T爆,所以需要优化. 假设有队列3个,我们队列顺序为1 2和队列顺序2 1,最后放3.可以发现如果确定了1 2和2 1的最小值后,放
阅读全文
摘要:原题链接 考察:区间dp 思路: 根据题目我们可以发现,当相邻两颗珠子合并时,只剩下首尾,中间部分不关心. 我们回顾一下区间dp,f[l][r]表示将[l,r]区间内的石子合并(以模板题为例),中间是什么我们也不关心,而f数组求最值是以某个分割点k来划分集合. f[l][r] = max(f[l][
阅读全文
摘要:原题链接 考察:状压dp 重复覆盖模型,最优解是用dancing links.这里dp可以比暴力dfs稍微优化. 本蒟蒻的思路: 枚举两个点(横坐标不能相同)构造一条抛物线.再对每一条抛物线看是否还有点能被该抛物线覆盖.最后dp求到达(1<<n)-1的最短距离. 除法一定要注意判0 1 #inclu
阅读全文
摘要:原题链接 考察:贪心 思路: 由贪心可得,最长上升子序列要求前面尽可能的小,最短上升子序列要求前面尽可能的大.如果没有<>的限制,那么最长上升子序列是1 2 3 4...n,最短上升子序列是n n-1...1.对于最长上升子序列,每有一个>说明前后需要互换位置,对于最短上升子序列,每有一个<说明前后
阅读全文
摘要:原题链接 考察:有限状态机dp+kmp 鬼才想得到的解法 思路: 在验证某串a是否为b的子串时,常常使用kmp算法.当子串匹配下标j = 子串长度时,说明串a是串b的子串.如果i取到串b的最后一位时,j还没有 = a长度,说明a不是b的子串. 在这道题,我们需要构造串b,使得a不是b的子串,也就是j
阅读全文
摘要:原题链接 考察:线性dp 思路: 很容易想到f[i][j]表示前i趟运了j头牛的最小时间(本蒟蒻虽然想到了但因为会T放弃了这个想法,所以会T的做法先想想看能不能优化啊啊啊) 所以f[i][j] = f[i-1][k]+sum[j-k]+2*m(这里会在最后一次多算一次m,最后答案减去即可).最后答案
阅读全文
摘要:原题链接 考察:树形背包dp 思路: 首先我们需要拿一个变量作为背包的体积,不能以钱数做体积,因为范围没有给定.所以只能以人数做体积.f[i][j]表示以i为根节点的子树中,选j个人的最大花费.如果>=0表示方案可行.因为人数是可以枚举的,所以不会漏解. 这里要注意的是背包体积不能直接设为m,否则会
阅读全文
摘要:原题链接 考察:背包dp 思路: 做之前看成01背包,然后答案一直不对,醉了. 实际是完全背包,因为需要的东西不超过5类,且不超过5个,所以可以用5维数组.5类物品的数目都是体积. 需要将编号离散化,这里用的是map映射. 但是注意的是我的本地IDE 在mp[x] = mp.size()是从1开始,
阅读全文
摘要:原题链接 考察:多重背包dp 思路: 多重背包板子,然后注意压掉一重循环需要倒序体积.... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 typedef long lo
阅读全文
摘要:原题链接 考察:背包dp 思路: luogu题解的300分界线的题解本蒟蒻完全看不懂 .这篇题解是自己对第一篇题解的理解. 首项观察数据范围可以发现此范围MLE,需要压缩范围.根据极差<=3.可以将体积范围压成1~4. 但是!这道题不能把m根据vi压缩体积,根据vi的压缩不同,会导致m得到不同的取值
阅读全文
摘要:原题链接 考察:单调栈 错误思路: 枚举滑动窗口大小,从头到尾计算.TLE O(n2) 正确思路: 根据a[i]对答案的贡献来计算,由题意得ans += (r-l)*a[i] 其中r是a[i]作为最大值的区间个数,l是a[i]作为最小值的区间个数.那么问题是如何计算区间个数. 首先明白单调栈和单调队
阅读全文
摘要:原题链接 考察:最短路 思路: 就是最短路....由贪心知道去曾今去过的点只会平白无故损失能量,所以要尽量不走旧点,可以跑一遍dijkstra g[n][n]需要long long,不知道是不是因为这个反复WA.... 1 #include <iostream> 2 #include <cstrin
阅读全文
摘要:原题链接 考察:思维 思路: 首先要发现负数个数a,正数个数b转化为其他ai bi实际上构成了一张无向图. 然后就能发现当负数个数为奇数时,且n为偶数时,会有一个负数不能转化为正数. 1 #include <iostream> 2 #include <cstdio> 3 #include <algo
阅读全文

浙公网安备 33010602011771号