线性

[SCOI2005]最大子矩阵(线性dp)

▼魔方 西西 提交于 2019-11-27 14:04:36
最大子矩阵 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。 输入格式 第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。 输出格式 只有一行为k个子矩阵分值之和最大为多少。 输入输出样例 输入 3 2 2 1 -3 2 3 -2 3 输出 9题目思路注意到m只会为1或2,为1时就是简单的一维线性dp过去,为2时就多加几个决策,有点麻烦dp1[i][j]表示在所取矩形最大坐标为i且取k个矩形的最大值,dp2[i][j][t]表示在所取矩形第一位最大坐标为i第二维最大坐标为j且取k个矩形的最大值 #include<bits/stdc++.h> #define mod 9999973 #define ll long long using namespace std; int n,m,k,dp2[101][101][11],g[101][3],dp1[101][11],sum1[101],sum2[101]; int main() { memset(dp1,128,sizeof(dp1)); memset(dp2,128,sizeof(dp2)); cin>>n>>m>>k; for(int i = 1;i<=n

【线性动态规划】相似基因

我的未来我决定 提交于 2019-11-27 09:59:28
方程挺好想的,就是本题的 初始化 我弄了挺久 不是忘了这个就是那个 #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> using namespace std; int n1,n2; const int N=103; char s1[N],s2[N]; int d1[N],d2[N]; const int tab[5][5]= { {5,-1,-2,-1,-3}, {-1,5,-3,-2,-4}, {-2,-3,5,-2,-2}, {-1,-2,-2,5,-1}, {-3,-4,-2,-1,0} }; int f[N][N]; int main() { scanf("%d%s",&n1,s1+1); scanf("%d%s",&n2,s2+1); for(int i=1;i<=n1;i++) { if(s1[i]=='A') d1[i]=0; else if(s1[i]=='C') d1[i]=1; else if(s1[i]=='G') d1[i]=2; else if(s1[i]=='T') d1[i]=3; } for(int i=1;i<=n2;i++) { if(s2[i]=='A') d2[i]=0; else if(s2[i]=='C') d2[i]=1; else if(s2

Operation HDU - 6579 (线性基)

拥有回忆 提交于 2019-11-27 08:29:24
Operation (HDU - 6579) 番外: 初学线性基,推荐一篇 线性基学习笔记 。 线性基就是一个没有冗余异或和的元素集合。 我们在集合内每一位记录一个贡献当前位的数字,就可以查询区间异或极值。 题意: 给一个初始序列,要求支持两种操作: 查询一个区间内的元素异或最大值。 向序列尾部添加一个元素。 题解: 我们考虑做一个前缀线性基和,然后插入元素的同时记录坐标,来保证让贡献高位的元素尽量靠右。这样可以保证在每个线性基和里查询区间的时候,查询到的数尽量大(贡献的位置尽量高)。查询的时候只查询坐标大于等于L的就可以了。 #include <bits/stdc++.h> #define fopi freopen("in.txt", "r", stdin) #define fopo freopen("out.txt", "w", stdout) using namespace std; typedef long long LL; const int maxn = 1e6 + 5; typedef pair<int, int> Pair; struct LinearBasis{ #define N 30 Pair a[N+1]; void init() { memset(a, 0, sizeof(a)); } bool insert(int val, int pos) { for

线性基

风流意气都作罢 提交于 2019-11-27 07:30:39
•参考资料 [1]: 算法 | 线性基学习笔记 [ 2]: 线性基学习笔记 •习题 洛谷P3812 【模板】线性基 (求最大) 牛客 xor序列 (查找) 洛谷P4570 [BJWC2011]元素 (插入/查找 线性基不为0) 洛谷P4301 [CQOI2013]新Nim游戏 (插入/查找 线性基不为0) 洛谷 P3265 [JLOI2015]装备购买 (实数线性基) hdu3494 XOR (第k大) •模板 1 ll n; 2 ll p[65]; 3 4 ///插入 5 void Insert(ll x) 6 { 7 for(int i=60;i>=0;i--) 8 { 9 if(x&(1ll<<i)) 10 { 11 if(!p[i]) 12 { 13 p[i]=x; 14 break; 15 } 16 x^=p[i]; 17 } 18 } 19 } 20 21 22 ///查找 23 bool Find(ll x) 24 { 25 for(int i=60;i>=0;i--) 26 { 27 if(x&(1ll<<i)) 28 { 29 if(!p[i]) 30 { 31 p[i]=x; 32 return true; 33 } 34 x^=p[i]; 35 } 36 } 37 return false; 38 } 39 40 41 ///最大值 42 ll get_Max

线性基模板

梦想与她 提交于 2019-11-27 06:33:34
线性基构造方法 对于每一个数,我们找出他的最高位的 1 在第 i 位, 如果此时 Pi 为零,就将这个数加入线性基,否则异或 Pi 继续找。然后我们就可以在 0 到 k 位上处理好每一位的线性基。这样得到的线性基保证每一位都能有对应的最大值。 void get_p(LL x) { for(int i=62;i>=0;i--) { if((x>>(LL)i)) { if(!p[i]) { p[i]=x; break; } x^=p[i]; } } } 求最大异或和 在我们得到的线性基中,从高位到低位用贪心贪掉每一个元素,如果异或了这个元素变大就异或他。 LL ans=0; for(int i=62;i>=0;i--) if((ans^p[i])>ans)ans^=p[i]; 查询某个数 我们也是从低到高扫这个数的每一位,如果这第 i 位为 1,就异或上 Pi,然后知道处理到最后一位。如果变成 0 了,那么就是可以的。 bool check(int x)//查询能否异或成某个数 { for(int i=31;i>=0;i--) { if(x>>i)x^=p[i]; } return x==0; } 线性基求交 有一道模板题,不过要用到线段树来优化查询 题目链接: https://ac.nowcoder.com/acm/contest/884/B #include<bits/stdc++

[转]在数学的海洋中飘荡

假装没事ソ 提交于 2019-11-27 06:23:16
以下资料来自 Dahua 的博客,非常可惜后来该博客关闭了。 在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进。 为什么要深入数学的世界 作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来,我在刚来这个学校的时候,并没有预料到我将会有一个深入数学的旅程。我的导师最初希望我去做的题目,是对appearance和motion建立一个unified的model。这个题目在当今Computer Vision中百花齐放的世界中并没有任何特别的地方。事实上,使用各种Graphical Model把各种东西联合在一起framework,在近年的论文中并不少见。 我不否认现在广泛流行的Graphical Model是对复杂现象建模的有力工具,但是,我认为它不是panacea,并不能取代对于所研究的问题的深入的钻研。如果统计学习包治百病,那么很多“下游”的学科也就没有存在的必要了。事实上,开始的时候,我也是和Vision中很多人一样,想着去做一个Graphical Model——我的导师指出,这样的做法只是重复一些标准的流程,并没有很大的价值。经过很长时间的反复,另外一个路径慢慢被确立下来——我们相信,一个图像是通过大量“原子

[转]无处不在的线性分解

五迷三道 提交于 2019-11-27 06:23:13
转自:Dahua的博客 http://dahuasky.wordpress.com/2008/10/02/%e6%97%a0%e5%a4%84%e4%b8%8d%e5%9c%a8%e7%9a%84%e7%ba%bf%e6%80%a7%e5%88%86%e8%a7%a3/ 深刻的思想往往蕴含在简单的数学形式之中。从小至今,对数学的学习一直不断,所学愈多,愈深感现代数学之博大,自己根基之薄弱。在自己所接触的数学之中,各种定理公式纷繁复杂,然细思之下,其核心思想却是非常简洁,但却广泛地以不同形式体现在各个分支之中。事实上,很多不同的数学分支在用自己本领域的语言阐述着一些共同的数学原理。 有三个基本的思想,在我所学到的数学中被普遍的运用:分解,逼近,变换。 分解(decomposition),是和合成(Integration)相互相承的。这里所说的分解思想,其实包括了三个阶段:首先,把一个一般对象,分解成简单对象的组合;然后,对每个简单对象分别加以分析和处理;最后把结果合成为对于原对象的结果。在不同的数学分支里面,分解的形式很不一样,后文中再详述。 逼近(approximation),就是构造简单对象的序列趋近一般对象,并通过这些简单对象的处理和分析结果来逼近一般对象的结果。这种思想在分析(Analysis)主要以极限(limit)的形式存在,是整个分析的根本。在不同的context里面

2019牛客多校第一场 H.XOR

百般思念 提交于 2019-11-27 06:12:06
传送: https://ac.nowcoder.com/acm/contest/881/H 题意: 给定一个长度为$n$的数列,询问所有异或和为0的子集大小的和。 数据范围: $1<=n<=10^5,1<=a_i<=10^{18}$。 分析: 首先先考虑暴力做法,需要枚举所有的子集情况。然后求异或和。(但这样肯定tle。 考虑每一个数对于整个答案的贡献。 已知:$X xor X=0$,所以如果一个数如果能被其他几个数表示,那么这个集合的异或和为0。 首先,先求出$n$个数的线性基$LB1$。设线性基的秩为$r$,就是插入线性基内数的个数。 1)考虑线性基外的数的贡献:线性基外的数有$n-r$个,对于一个$LB1$外的数$x$,有剩下的$n-r-1$个数可以与$x$组成$2^{n-r-1}$个子集。这些子集与线性基$LB1$都可构成异或和为0的集合。 2)考虑线性基内的数的贡献:对于$LB1$内的数$x$,可以考虑用剩下的$n-1$个数构成的线性基$LB3$(秩为$r2$),然后判断$x$是否可以插入$LB3$内,如果不可以被插入,那么就是可以由$LB3$内的数异或构成,对于答案的贡献$2^{n-r2-1}$。 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int