- 博客(17)
- 收藏
- 关注
原创 关于Headmaster‘s Headache的题解报告
题目链接:Headmaster's Headache - UVA 10817 - Virtual Judge我们观察到n这个值数据很小,因此可以想到用三进制压缩课程的状态,第i为表示第i+1个课程的状态,0表示没有人教授,1表示有一个人教授,2表示两人以上进行教授,故状态很容易就可以表示出来:前i个教授教授的课程状态为j的情况下花费的最小费用(第i个教授还没有考虑),推状态方程有个注意点,如果是由前面的阶段去推当前的状态会多一个枚举决策的时间花费,而由当前状态去推未来状态的则就不用花费枚举决策的时间花费
2022-03-19 21:45:41
1066
原创 欢度佳节题解
题目链接:欢度佳节思路:首先我们观察到格子只有17个,则这可以让我们想到状态压缩(用二进制压缩状态),之后在借助dfs进行连通块遍历即可,时间复杂度o(x17)。注意点:1.我们首先要将二进制上的每一位与图上的17个格子一一对应,这一点比较麻烦。 2.遍历连通块一般运用dfs。(套路) 3.一般而言,若n小于20,则可以考虑状态压缩。(套路)所以,这题其实并不难,就是比较考验码力。代码:#include<bits/stdc++....
2022-03-06 20:55:35
489
原创 初探树形动态规划
前言:树形动态规划是比较套路的动态规划类型,其中有一些规律性的东西值得总结,下文树形动态规划将用树形dp代替。树形dp的套路(一般都是成立): 1.以结点从深到浅的顺序作为dp的“阶段".(枚举顺序) 2.第一维常常是结点的编号,状态的定义常常是"以i的子树......"或者”i的.......(全部)". 3.状态一般是有子节点传递过来.(状态转移方程)通用结构(c++):树形dp框架typedef struct node{ int from,to,dist...
2021-12-11 17:24:38
242
原创 牛客练习赛93-C题-点权
ps:这道题当时赛场上脑抽想到拓扑排序去了,这题并不能用拓扑排序写,因为这题要求将点权变成2的最小花费,而这最小花费是与边权有关系的,而与深度没关系。如何想到树形dp?:题目已经明说这是一颗树了,首先我们不难看到更新都是从叶结点向上传递,这就满足了dp的无后效性,又因为不难发现每一个点作为根节点结果都不同,于是我们不难想到一个o(n*n)的算法。朴素算法o(n*n):枚举每一个结点作为根节点,然后进行树形dp,每个结点调最小的那个值即可。改进-换根法o(n):不难发现以上模型就是换根法的模型,我
2021-12-11 15:11:27
535
原创 初探并查集
前言:笔者最近学习了算法进阶指南的并查集的章节,写了几道题,也算是有些许感悟,于此写一些。并查集的作用:一种十分高效地维护各个元素之间的关系的数据结构,常见的关系有:亲戚关系,敌对与盟友关系,捕食与被捕食关系,两个元素之间夹着多少个元素(比较特殊).并查集的种类:单一关系(普通并查集),多种关系(带权并查集或扩展域并查集)。带权并查集基本模板(路径压缩和按秩合并): 注:路径压缩模板一般是不变的,而按秩合并是变化,需要根据题意推导合并公式。 路径压缩(均摊复杂度o(l...
2021-12-06 22:07:54
190
原创 组合数学
乘法和加法的运用:Problem - 1594E1 - Codeforces排列组合求概率:建模:Problem - 1514B - Codeforces
2021-10-21 23:31:47
103
原创 求删除某些数位的数字从而得到某一个指定数的最小操作次数
这类题一般都是暴力,但不同的题暴力的方法又不太一样一.直接枚举所有指定的数(通常这些数的个数不多,常常是幂级别的)题目链接:Problem - 1560D - Codeforces题目大意:给你两种操作:1.删去某一数位的数字。2.在数的最右边加上一个数字。你可以重复这两个操作无限次,现在给你个整数n,要求你求出使用这个操作使得n变成的最小操作数.思路:时间复杂度,因为,故我们只需枚举到,一个个匹配求最小操作次数,设匹配的位数为k,长度为m,则最小操作次数为.去最小即可。二.枚举
2021-10-21 23:18:07
1105
原创 D1. All are Same的两种思路
题目信息:题目链接:Problem - D1 - Codeforces题意简化:给n个整数,寻找一个整数k,你可以将减少(增加)k,这个操作可以无限次数使用,使得所有数都变得一样,如果找不到这样的数,输出-1.解法(暴力和数论):数论思路;时间复杂度,容易发现目标数应该是n个整数中最小的那个数,而每个数减去整数个k而得到目标数,我们先将数组从小到大排序(下标从1开始),,注意最后特判k.暴力思路:时间复杂度,即是k一定是满足,先从最大值开始,然后每次都减去一,判断是否满足,满足则退出
2021-10-21 22:34:58
336
原创 codeforces的容斥原理的运用
一.基础公式: 1.2.二.容斥原理应用模型举例: 1.从一个大集合中能否按照某种规则划分为两个互斥的子集. 例题:Groups 此题的题意成功等价于A和B大于等于0且S=n.
2021-10-12 21:01:30
159
原创 数论之质数与约数基础知识点梳理
质数质数:也称素数,指的是无法被除1和其他自然数整除的正整数,1不是质数。质数定理:设一个足够大的正整数x,则不超过x的质数的个数大致为。质数的判定:试除法:若有一个合数x,则存在一个能整除x的数t,。质数筛:埃式筛法:任意整数x的倍数2x,3x,4x......kx不是质数。 void get_prime(int n){ for(int i=2;i<=n;i++){...
2021-09-28 18:39:01
610
原创 关于在算法竞赛中的优化的一些小技巧(一)(不涉及算法)
1.快读优化(在1e3以上的数据量比cin快20%)template<typename T>inline void read(T &x){ x=0; int f=1; char c=getchar(); //c++17中删除了register while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<
2021-09-24 00:44:46
259
原创 完全背包问题解题总结
前言: 1.01型背包问题(一维)链接:https://blog.youkuaiyun.com/qq_56430444/article/details/118157798 2.01型背包问题(二维)链接:https://blog.youkuaiyun.com/qq_56430444/article/details/118160876完全背包问题模板: 1.状态:dp[i]表示的是在背包容量为i下能装载的最大物品价值总和。 2.状态转移方程: if ( i >= w[j] ) { dp[i] ...
2021-07-01 17:53:46
847
原创 01型背包问题解题总结(二维)
01型背包问题的模板(二维): 1.状态:dp[i][j]表示状态i和状态j下背包所能装置的最大价值。 2.状态转移方程: if ( i>= w1[i] && j>=w2[j] ){ dp[i][j] = max ( dp[i-w1[j]][j-w2[j]]+v[j],dp[i][j] ) }3.循环方向: for(枚举第一个状态,逆向) for(枚举第二个状态,逆向) ...
2021-06-23 20:03:08
530
原创 01型背包问题解题总结(一维)
01型背包问题的模板(一维): 1.状态:dp[i]表示为背包容量为i所能装下的最大价值。 2.状态转移方程: if( i>=w[j] ){ dp[i] = max ( dp[i-w[j]]+v[j] , dp[i] ) 3.循环方向: for(枚举物品的编号,正向) for(枚举背包的容量,逆向) 决策(状态转移方程) 4.初始化:看题目而定01型背包问题...
2021-06-23 18:10:22
772
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人