随笔分类 - 算法之旅
摘要:题目链接 https://www.acwing.com/problem/content/303/ 题解 AC代码 import java.util.*; public class Main { static int N = (int) 3e5 + 10; static long[] sumT = n
阅读全文
摘要:题目链接 https://www.acwing.com/problem/content/302/ 题解 AC代码 import java.util.*; public class Main { static int N = 5010; static int[] sumT = new int[N],
阅读全文
摘要:题目链接: https://www.acwing.com/problem/content/description/526/ 题解: 记忆化搜索比较好理解 状态转移DP只对全1情况有最优解 AC代码: 记忆化搜索 // 记忆化搜索 import java.util.*; public class Ma
阅读全文
摘要:题目链接: https://www.acwing.com/problem/content/1066/ 题解: 需要分析出来,第j+1列的摆放,只和第j列的摆放有关系,这很重要,本质上和蒙德里安那题是一致的,只是合法状态的转移计算更加复杂,需要预处理的地方更多。 AC代码: // f[i][j][k]
阅读全文
摘要:题目链接: https://www.acwing.com/problem/content/description/1054/ 题解: kmp + dp f[i][j]: 在第i个字母已经选取的情况下,状态为j的所有方案的数量,这里的j表示kmp中已经匹配的模板串的数量 状态机的状态解释很难想到,建议
阅读全文
摘要:题目链接 https://www.acwing.com/problem/content/description/736/ 题解 一句话概括:考虑顺序的01背包问题 详细题解: stone: 花费时间si, 初始能量ei, 每秒损失的能量li 假设最优解的选取序列为x1,x2,...,xk,xk+1,
阅读全文
摘要:题目链接 https://www.acwing.com/problem/content/12/ 题解 f[i][j]:表示从i-n中选,总体积不超过j的最大价值 这种"向前"的状态转移方式,是一种可以考虑的状态刻画方式 AC代码 /* f[i][j]:表示从i-n中选,总体积不超过j的最大价值 */
阅读全文
摘要:题目链接 https://www.acwing.com/problem/content/10/ 题解 需要注意的点就是,f[u][j]实际上是优化过第第二维后的状态表示,原状态表示应该是f[u][i][j]:对于根结点u,考虑其前i个子树,总体积不超过j的最大价值 dfs(root)的递归含义是:以
阅读全文
摘要:**题目连接:**https://www.acwing.com/problem/content/description/848/ 错误代码分析: 重点就在于这句话: t2 += son[e[j]]; 并不是每一个子节点都应该被加上,这个过程只能在深搜时进行,因为st数组在深搜后就无效了,所以这么写为
阅读全文
摘要:**题目链接:**https://www.acwing.com/problem/content/description/242/ 题解: 见代码详细注释 AC代码: import java.util.*; public class Main { static int N = (int) 5e4 +
阅读全文
摘要:**题目链接:**https://www.acwing.com/problem/content/803/ 解法: 核心lowbit操作:x & -x 操作的含义: x代表原数(不论负数正数):如101110100 -x的计算方式是:x的所有位取反+1,即010001011 + 1 = 0100011
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/790/ 解法: 主要的问题集中在第22行的处理,记住一个原则:谁流失,统计谁!一旦j++,那么arr[j]将不可能被统计到,所以应该统计所有大于arr[j]的右边的数 AC代码: import java.uti
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/788/ 解法1: 递归性质,设计一个查找函数,不断缩小搜索范围,最终找到第k个数字。符合递归函数设计原则。 解法2: 二分的思想,每次只对第k个数字所在部分进行排序,最终保证,第k个数处
阅读全文
摘要:题目链接: https://www.acwing.com/problem/content/156/ 题解: 做滑动窗口,一般先假想成普通队列来做,再分析题目的单调性,改进优化 AC代码: import java.util.*; import java.io.*; public class Main
阅读全文
摘要:==116. 飞行员兄弟== 题目链接: https://www.acwing.com/problem/content/118/ 题解: 1、递归: 递归的最难理解的点就是要从满足题目的 从左向右,从上到下 ,所以遇到y == 4的边界时,就应该跳到下一行的第一个位置, 注意恢复现场 。 2、位运算
阅读全文
摘要:95. 费解的开关 题目链接: https://www.acwing.com/problem/content/97/ 题解: 前一行的状态可以决定后一行的按法,因为一个开关按两次等于没按,所以第一行的状态确定了,第二行就必须那么按,我们可以枚举第一行的按法,然后进行模拟,因为一行有5个框框,就有32
阅读全文
摘要:92. 递归实现指数型枚举(Acwing) 题目链接: https://www.acwing.com/problem/content/94/ 题解: 一个位置选或者不选两种情况,递归到边界(n个已经选完了),输出结果即可 AC代码:
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/1098/ 题解: 三维的一个BFS,visit数组和结果数组合并,一定要记得每次BFS清空visit数组即可 AC代码(Java):
阅读全文
摘要:题目链接: https://www.acwing.com/problem/content/1103/ 题解: !!! 要么在bfs内部定义queue,要么每次在进入bfs时将queue清空!!!! AC代码:#include <cstdio> #include <cstring> #include
阅读全文
摘要:题目链接: https://www.acwing.com/problem/content/1240/ 题解: 双指针算法,注意率先移动前向的指针,当前向指针的时间-后向指针的时间超过了规定时间的话,后项指针要移动到该区间里才行 AC代码: #include <cstdio> #include <cs
阅读全文