- 博客(14)
- 收藏
- 关注
原创 练习题(动态规划)
假设,我们想求一下当前这个数 ai,以ai结尾的最长子序列,那我们要从序列里找到一个最大的小于ai的序列,假设长度为4的上升子序列的最小结尾值是q4,q4是最大的小于等于ai的数,那把ai接过去,那这样我们就得到了一个以ai结尾的长度为5的上升子序列,假设长度为5的上升子序列的最小结尾是q5,由于q4是最大的小于等于ai的,那么q5就是大于等于ai的,所以ai一定不可能接到长度是5的子序列后面,因此,以ai结尾的上升子序列的最大长度就是5,那如何找到最大的小于等于ai的数呢?一,最长上升子序列2。
2024-10-22 21:54:33
811
1
原创 动态规划2
注意方程的变换,应该找数字下面的两个数字坐标,再加上本身a[i][j]如果还是嫌麻烦,我们可以倒序dp,这样边界问题一点都不用考虑了。如果想要知道最长子序列是什么的话,可以记录当前点是从哪个点来的。当然,初始也不用思考边界问题,直接把所有都初始化。这里输出的序列是倒着输出的,正着输出的话可以用栈。代码很简单,直接用状态转移公式。是指递推方程有明显的线性关系。
2024-10-21 20:57:22
207
原创 动态规划1
正序的情况下,假设循环到第二轮,i = 2,j循环到4了,那么f[4] = max(f[4], f[4 - 2] + w[2]),这里用到了f[2]对应二维应该是f[1][2],但是一维下却成了f[2][2]也就是f[i][j - v[i]] 很显然跟公式不对,因为f[2]在之前j循环到2的时候被更新了一轮,从第i - 1 轮更新到第i轮了,也就是被污染了。但是逆序的话当我们j枚举到4的时候,这里用的 f[2]是还没有被更新的第i - 1轮的 f[2] 正好对应二维的 f[i - 1][j - v[i]]
2024-10-16 23:05:37
599
原创 数学知识3
所有输入系数以及常数均保留两位小数,绝对值均不超过 100100。因为 a > b, b含有的素数a都包括。要根据数据范围选择不同的方法。为何代码里筛素数只筛了a?
2024-10-09 22:58:06
206
原创 数学知识2
第一种情况时,pj是i的最小质因子,pj小于i的所有质因子,所以pj同时也是i * pj的最小质因子,就有了上面的式子,而 i * (1 - 1/pj) ... (1 - 1/pk)正好是i的欧拉函数,所以简化成phi[i] * pj。第二种情况时,pj 不是i的质因子,又因为 pj * i 的质因子有 pj 和 i 的所有质因子,所以就是第二个式子,而同理把 i * (1 - 1/p1) ... (1 - 1/pk) 简化成phi[i]p是质数,p是质数,p是质数,不是质数就不行了,费马定理就不能用了。
2024-09-26 21:49:09
313
原创 搜索与图论3
定义:在一个加权图(即边具有权重或成本的图)中找到一棵包含所有顶点的树,使得这棵树中的所有边的权重之和尽可能小。题目对应一般是无向图,正负边都没关系。
2024-09-07 16:38:44
1016
原创 搜索与图论2
假如这种情况,要求1到5的最短路,发现1根本走不到5,但是4经过松弛操作后会更新5号点,显然0x3f3f3f3f < 0x3f3f3f3f - 999,,所以5号点会更新成0x3f3f3f3f - 999,所以这时候判断dist[n] == 0x3f3f3f3f显然不合适,边长的绝对值不超过100000,减的也不会太大,和0x3f3f3f3f在一个数量级即可。
2024-08-18 16:02:40
859
原创 八数码问题
题目类似于数字华容道,可以抽象一下,把每一个状态当成一个节点a,它的变化后的下一个状态是另一个节点假如是b,我们就连一条a到b的边,权重是1,例如,状态表示:我们可以把二维三乘三的矩阵变成一维的string来存储,用一个字符串来表示一个状态,队列定义的话直接queue<string>q;状态转移,我们先把字符串想象成三乘三的样子,把x的上下左右分别枚举,把这些位置的数移动到x上,最后再把它变成string。在一个 3×3的网格中,1∼8这 8个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。
2024-05-21 17:43:53
221
1
原创 哈希表算法
作用:把一个复杂的数据结构映射到比较小的区间0到n,比如把0到10^9的数映射到0到10^5内离散化可以看做是一个极其特殊的哈希方式这就会产生冲突,就是某些数映射成同一个数,为了处理冲突有两种方法,拉链法和开放寻址法哈希算法是一个期望算法,在算法题里面一般只会添加一个数和查找一个数,一般不会有删除操作,如果有删除操作,一般不会真的删除某个点,可以开一个bool数组在删除的点上做个标记。
2024-04-23 22:33:50
1640
原创 堆排序(如何手写堆)
同上面,不过不需要考虑是要往上移(k位置上的数变小了)还是往下移(k位置上的数变大了),down和up只会做一个。####3.删除最小值 heap[1] = heap[size];####4.删除任意一个元素 heap[k] = heap[size];是一个完全二叉树,除了最后一层节点之外,上面都是非空的,最后一层从做到右以此排布。用一维数组存储,下标从1开始,1为根节点,x的左儿子为2x,x的右儿子为2x+1。down(x) 把一个节点往下移 up(x)把一个节点往上移。
2024-04-16 22:26:12
503
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人