线性

LCS最长公共子串:线性dp

走远了吗. 提交于 2020-02-16 23:28:40
LCS最长公共子串 题目: 有两个字符串,串T为ABCBDAB,而串S为BDCABA,求最长公共子串的长度: 首先我们分析,如果有两个字符Ti和Sj,就有以下公式: dp[i][j]=dp[i-1][j-1]+1; T[i]==S[j]; dp[i][j]=max(dp[i-1][j],dp[i][j-1]); T[i]!=S[j]; 可以带本题例子证出,这里就不说明了。 代码: # include <cstdio> # include <cstring> # include <algorithm> using namespace std ; const int MAXN = 1e3 ; char a [ MAXN ] , b [ MAXN ] ; int dp [ MAXN ] [ MAXN ] ; void LCS ( int n , int m ) { for ( int i = 1 ; i <= n ; i ++ ) for ( int j = 1 ; j <= m ; j ++ ) dp [ i ] [ j ] = a [ i ] == b [ j ] ? dp [ i - 1 ] [ j - 1 ] + 1 : max ( dp [ i - 1 ] [ j ] , dp [ i ] [ j - 1 ] ) ; } int main ( ) { scanf ( "%s%s

算法导论系列笔记之线性时间排序

家住魔仙堡 提交于 2020-02-14 17:55:39
线性时间排序 以下为本人整理课程笔记 课程地址: b站搬运 github: 还有除了算法导论外一些基础知识的笔记 我们能做到的排序有多快? 速度取决于计算模型【哪些操作是被允许的】 比较排序的算法模型 在模型中只能进行两两之间的大小比较来决定顺序 快速排序 归并排序 插入排序 堆排序 定理 比较排序的算法速度不会超过 nlgn 决策树 举例3个数进行比较排序的决策树 每一个内部节点都会有一个下标为i:j标记,左孩子为小于等于,右孩子为大于 每一个叶结点表示一个排序结果,其中有一个是正确的特定排序 决策树模型 构建可以接收n个数进行比较的一个决策树【至少一个 就是把算法中可能的结果都列出来 树的叶子结点与n的阶乘有关,树的大小与n的指数有关 运行时间与树的高度 以此去证明比较排序的下界为 nlgn 证明 n!<=2^h 【lgn为单调递增函数 h>=lg(n!) 确定性算法:它执行的每一步都是完全正确的 如果是随机算法,就会得到不止一个树,而是一个概率分布的多种 线性时间内完成 计数排序 假定要排序的是n个整数,每个整数都在1到k的范围内,需要辅助存储序列 伪代码 COUNTING-SORT(A,B,k) let C[0…k] be a new array //记录各个数出现的频率 for i=0 to k C[i] = 0 for j=1 to A.length C[A[j]] =

线性代数

十年热恋 提交于 2020-02-13 23:10:07
目录 第一章 行列式 1 二阶与三阶行列式 2 全排列及其逆序数 3 n阶行列式的定义 4 对换 5 行列式的性质 6 行列式按行(列)展开 7 克拉默法则 习题 第二章 矩阵及其运算 1 矩阵 2 矩阵的运算 3 逆矩阵 4 矩阵分块法 习题二 第三章 矩阵的初等变换与线性方程组 1 矩阵的初等变换 2 矩阵的秩 3 线性方程组的解 习题三 第四章 向量组的线性相关性 1 向量组及其线性组合 2 向量组的线性相关性 3 向量组的秩^ 4 线性方程组的解的结构 5 向量空间 习题四 第五章 相似矩阵及二次型 1 向量的内积、长度及正交性 2 方阵的特征值与特征向量 3 相似矩阵 4 对称矩阵的对角化 5 二次型及其标准形 6 用配方法化二次型成标准形 7 正定二次型 习题五 第六章 线性空间与线性变换 1 线性空间的定义与性质 2 维数、基与坐标 3 基变换与坐标变换 4 线性变换 5 线性变换的矩阵表示式 习题六 来源: https://www.cnblogs.com/end/archive/2011/11/13/2247563.html

bzoj 2460: [BeiJing2011]元素【线性基+贪心】

半城伤御伤魂 提交于 2020-02-13 14:44:48
先按魔力值从大到小排序,然后从大到小插入线性基中,如果插入成功就加上这个魔力值 因为线性基里是没有异或和为0的集合的,所以正确性显然,然后最优性,考虑放进去一个原来没选的,这样为了可行性就要删掉一个,又因为是从大到小加进去的,所以删掉的这个魔力值一定是大于加进去的,所以不优,所以贪心构造的就是最优解 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1005; int n,ans; long long b[65]; struct qwe { int v; long long a; }a[N]; bool cmp(const qwe &a,const qwe &b) { return a.v>b.v; } bool ins(long long x) { for(int i=60;i>=0;i--) if(x>>i) { if(!b[i]) { b[i]=x; return 1; } x^=b[i]; if(!x) return 0; } return 1; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld%d",&a[i].a,&a[i].v); sort(a+1,a+1+n

线性基证明及使用

不羁的心 提交于 2020-02-13 13:54:32
线性基使用及证明 定义 线性基就是从一堆序列中,构造出一个序列,该序列通过异或组合可以组成原序列的任一一个序列(也就是线性代数所学的极大无关组的异或形式,也可以说是低配极大无关组,所以极大无关组满足的性质其都满足) 性质 性质1 由线性基可以异或出原序列的任一一个数 证明:由原序列求出一个线性基,设一个不在线性基的数为x,x不能被线性基异或得,则x可以插入线性基,则与线性基的定义矛盾,故得证 性质2 线性基中的数异或起来不能产生0 证明:设线性基里由 \(a_1...a_n\) 设 \(a_{b_1}\bigoplus a_{b_2}\bigoplus a_{b_3}=0\) 那么有 \(a_{b_1}\bigoplus a_{b_2} =a_{b_3}\) 所以只需要 \(a_{b_1} a_{b_2}\) 就可以表示原序列所有的数,所以线性基容量可以缩小,这与极大无关组的定义矛盾,得证 性质3 线性基的向量个数一定 证明 若同一组向量组存在两组线性基 \(a_{b_1} a_{b_2} a_{b_3}\) 和 \(a_{c_1} a_{c_2}\) 那么由线性基的定义,第二组线性基可以表示出第一组线性基的所有变量,那么由极大无关组定义,可以把第一组线性基 转换为第二组的线性组合,转化之后,组内相互异或仍然是线性基,所以第一组进行线性组合异或后,必然产生 \(a_{c_1} a_

线性基

时光怂恿深爱的人放手 提交于 2020-02-10 05:35:05
简单来说一些数的线性基就是一组数据 \((q_1,q_2,q_3...)\) 使得这些数的任意一个子集的异或和可以由这组数据表示,其中 \(q_x\) 的最高位是x [cqoi2013]新Nim游戏 普通Nim游戏的必胜条件是异或和不为0 这道题就是要我们先拿走一些使得第二个游戏者无论拿什么都不能使得剩余部分异或和为0,也就是说对于后者面对的集合没有一非空子集个的异或和是0 这就代表着所剩集合线性不相关!(即没有一个子集能用另一个子集表示 也就是说我们从大到小的往线性基里加元素,加不进去的就统计进答案 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define M 100001 using namespace std; int n,m,k,a[M],d[M]; long long ans; bool add(int x) { for(int i=31;i>=0;i--) { if(!(x>>i)) continue; if(!d[i]) {d[i]=x; return 1;} x^=d[i]; } return 0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a

洛谷题解 P1292 【倒酒】

坚强是说给别人听的谎言 提交于 2020-02-09 18:58:23
分析: 首先看完这个题,我瞬间想到了我小学时做的奥数题。。。。。。 然后我翻了翻,发现没有做错题。。。。。。 咳咳,进入正题: 这个题首先基本没有什么思路,按照以往的做法,我们模拟一下数据+自造数据找规律。 事实证明,完全是可以的。 这个题的考点就是数论(gcd,exgcd) 什么gcd,exgcd具体做法其余dalao们已经讲的很清楚了,我这个蒟蒻简单叨叨几句: 拓展欧几里得算法: 一定存在整数a,b,使得ax+by=(x,y) 欧几里得算法:gcd(x,y)->gcd(y,x%y) gcd(x,y)->gcd(y,x-⌊x/y⌋*y) 如果已知a’y+b’(x- ⌊x/y⌋ *y)=(x,y) 整理得b’x+(a’-b’⌊x/y⌋)y=(x,y) 最底层:x’=(x,y) y’=0 显然有1 x’+0 y’=(x,y) 于是可以递归求出a,b 拓展欧几里得算法告诉我们x与y的线性组合的取值可以是(x,y),那么自然(x,y)的整数倍也能够被取到。/ Thm: x与y的线性组合能且仅能取(x,y)的整数倍 那线性组合又是什么? Def:∀a,b∈Z ax+by为x与y的一个线性组合 那么x与y的线性组合可能取到哪些值? 设k=(x,y), p=ax+by p=k(ax/k+by/k) p是k的整数倍! x与y的线性组合的取值只能是x与y的gcd的整数倍 话不多说,上代码:

对线性筛的理解

空扰寡人 提交于 2020-01-31 02:46:17
线性筛 思想:每个数有且仅筛一次 解决:每个数只被其最大因子(非本身)筛去 设合数x最小素因子为p,x=pq,易知p<=q 我们让x只被q筛去,选择枚举q 枚举q时,找到所有满足的p,筛去数x,一个不漏 void sieve ( ) { for ( int i = 2 ; i <= m ; i ++ ) { //枚举q if ( v [ i ] == 0 ) { ps [ ++ cnt ] = i ; //统计p } for ( int j = 1 ; j <= cnt ; j ++ ) { //枚举满足的p if ( i * ps [ j ] > m ) break ; v [ i * ps [ j ] ] = 1 ; if ( i % ps [ j ] == 0 ) break ; //条件判断 } } } //统计2到m的质数 上述代码意思是:设q最小素因子为u,q=uv 1.若p<=u(p是质数),则p是x=pq的最小素因子,满足条件,筛去x 2.若p>u,x=pq=puv=u*(pv),p不是x最小素因子,这个数会被pv(大于q)筛去,重复了,可以跳出不再筛x 至此,这个算法的正确性和充分性都被证明了. (原创) 来源: CSDN 作者: cqbzlydd 链接: https://blog.csdn.net/cqbzlydd/article/details

线性卡尔曼滤波KF

你。 提交于 2020-01-29 08:48:08
线性卡尔曼滤波KF clear; clc; N=100; Z=(1:N);%观测值 noise=randn(1,N);%mean=0,方差为1的高斯噪声 Z=Z+noise; X=[0;0];%初始状态 P=[1 0; 0 1];%状态协方差矩阵 F=[1 1; 0 1];%状态转移矩阵 Q=[0.0001 0; 0 0.0001];%状态转移协方差矩阵0.0001 0; 0 0.0001 H=[1 0];%观测矩阵 R=1;%观测噪声方差 figure; hold on; sz = [2,N]; res=zeros(sz); for i=1:N X_=F*X; P_=F*P*F'+Q; K=P_*H'/(H*P_*H'+R); X=X_+K*(Z(i)-H*X_); P=(eye(2)-K*H)*P_; res(1,i) = X(1); res(2,i) = X(2); %plot(X(1), X(2),'r-');%横轴表示位置&纵轴表示速度 end plot(res(1,:), res(2,:),'r-+'); 来源: CSDN 作者: hjwang1 链接: https://blog.csdn.net/hjwang1/article/details/103647852