算法
WA自云力机
这个作者很懒,什么都没留下…
展开
-
题解 [USACO10NOV]Buying Feed G
看完这到题,很容易想到用背包做,即设状态fi,jf_{i,j}fi,j表示前iii个商店一共带了jjj吨货的最小花费,只需要先把商店的位置排个序,就可以直接枚举了,那么就可以得到状态转移方程{fi,j=fi−1,j+j∗j∗(Xi−Xi−1),u=0fi,j=min0≤j≤k,1≤u≤Fi(fi,j−u+u∗Ci)\begin{cases} f_{i,j}=f_{i-1,j}+j*j*(X_i-X_{i-1}),u=0\\ f_{i,j}= \underset{0\le j\le k,1\le u\le原创 2020-12-13 20:38:58 · 132 阅读 · 0 评论 -
[CQOI2017]小Q的棋盘
看到这道题,很容易想到是一道树型DP,那么该如何做?首先我们可以先这样定义状态,fi,jf_{i,j}fi,j表示以iii为根节点,向下走jjj步最多能经过多少点,但很明显,只是这样是不行的,所以我们再加一维,第三维为0表示不会到根节点,第三维为1表示需要回到根节点,那么就可以得出状态转移方程{fi,j,0=max(fi,j−t,0+fv,t−2,1,fi,j−t,1+fv,t−1,0)fi,j,1=max(fi,j−t,1+fv,t−2,1)\begin{cases}f_{i,j,0}=max(f_原创 2020-12-07 22:02:12 · 123 阅读 · 0 评论 -
题解 UVA1630 串折叠 Folding
题目描述折叠的定义如下:一个字符串可以看成它自身的折叠。记作S = SX(S)是X(X>1)个S连接在一起的串的折叠。记作X(S) = SSSS…S(X个S)。如果A = A’, B = B’,则AB = A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B) = AAACBB,而2(3(A)C)2(B) = AAACAAACBB给一个字符串,求它的最短折叠。例如AAAAAAAAAABABABCCD的最短折叠为:9(A)3(AB)CCD。输入格式仅一行,即原创 2020-11-29 20:24:21 · 208 阅读 · 0 评论 -
高斯消元
例题P2455 [SDOI2006]线性方程组高斯消元做法首先声明一个变量存当前已经确定的方程组的数量1.枚举每一列2.找出每一列绝对值最大的一行3.将该行放到最上面4.将该行第一个系数变为13.将该列下面所有行的值变为0代码实现sq[i][j]sq[i][j]sq[i][j]存的为第i行第j个系数找出每一列绝对值最大的一行for (int i = r; i <= n;i++) if(fabs(sq[i][j])>fabs(sq[t][j])) t = i;原创 2020-08-28 07:59:30 · 108 阅读 · 0 评论 -
扩展欧几里得定理
裴蜀定理:对于任意x,y,若满足k1x+k2y=dk_1x+k_2y=dk1x+k2y=d有解,则d一定为k1,k2k_1,k_2k1,k2的最大公约数证明:∵d为x,yx,yx,y的最大公约数∴x,y一定为d的倍数∴k1x+k2yk_1x+k_2yk1x+k2y也一定为d的倍数,则一定存在k1,k2k_1,k_2k1,k2为方程的一组解通过欧几里得算法递归来求k1,k2k_1,k_2k1,k2核心为gcd(a,b)=gcd(b,a%b)若满足k1x+k2y=dk_1x+k原创 2020-08-27 15:51:20 · 153 阅读 · 0 评论 -
扩展中国剩余定理(EXCRT)
例题P4777 【模板】扩展中国剩余定理(EXCRT)对于每一个x≡b1(mod a1)x≡ b_1(\mod a_1)x≡b1(moda1),可以设k为x/a1x/a_1x/a1的商,易得an∗kn+bn=xa_n*k_n+b_n=xan∗kn+bn=x。对于前两个式子{a1∗k1+b1=xa2∗k2+b2=x\begin{cases}a_1*k_1+b_1=x \\a_2*k_2+b_2=x\end{cases}{a1∗k1+b1=xa2∗k2+b2=x可得原创 2020-08-26 21:59:54 · 241 阅读 · 1 评论 -
LCA(最近公共祖先)
例题给定一颗多叉树,求两个点的最近公共祖先dfs遍历预处理出每个节点的父亲信息,存在fa[x][0]中。fa[x][j]为x点向上走2^i步所到的节点depth[x]为x点所在的深度void dfs(int x,int f){ v[x] = 1; dpth[x] = dpth[f] + 1; fa[x][0] = f; for (int i = 1; i <= t;i++) fa[x][i] = fa[fa[x][i - 1]][i - 1]原创 2020-08-19 15:32:48 · 134 阅读 · 0 评论 -
K短路
次短路目前知道的方法有:1.跑一遍最短路,一次枚举删边 2.在跑最短路时同时记录最短路与次短路 3.起点和终点分别跑一次最短路,枚举边来替换最短路上的边例题P1491 集合位置#include<cstdio>#include<cmath>#include<queue>#include<cstring>using namespace std;typedef pair<double, int> PDI;const int INF =原创 2020-08-15 09:07:06 · 174 阅读 · 0 评论 -
深度优先搜索的优化与技巧
迭代加深DFS在一些问题模型中可能无限扩展,如8数码问题,无限扩展会有些问题,增加深度限制:假设目标状态所处深度不超过某阈值。人为设定,当搜索深度到达阈值时直接剪枝,不再往下搜索。Iterative Deepening Depth - First Search适用:求最优/深度最低/步数最少解,当问题深度和广度都大的时候方式:不断放宽迭代深度限制第一次找到的目标状态即为最优解。迭代加深是深搜和广搜的结合,普通深搜求最优解必须遍历所有状态打擂台得到,迭代加深后,第一次遇见目标状态即可得到最优解原创 2020-08-08 20:18:57 · 980 阅读 · 0 评论 -
广度优先搜索的优化与技巧
广搜例题:P1397 八数码难题普通BFS双向BFS原创 2020-08-08 20:01:39 · 892 阅读 · 0 评论 -
数论
查找int find(int x){ if(p[x]!=x) p[x]=x; return p[x];}赋值void add(int a,int b){ int a1=find(a),b1=find(b); if(a1!=b1) p[a]=b;}原创 2020-08-07 11:45:13 · 81 阅读 · 0 评论