二维

二维前缀和

穿精又带淫゛_ 提交于 2020-01-30 00:35:59
题目大致意思求最大矩阵 输入k 矩阵元素和不超过k #include<stdio.h> #include<iostream> #include<algorithm> typedef long long ll ; using namespace std ; ll a [ 255 ] [ 255 ] ; ll sum [ 255 ] [ 255 ] ; int main ( ) { ll k ; int m , n ; ll ma1 = 0 ; cin > > m > > n > > k ; for ( int i = 1 ; i < = m ; i + + ) for ( int j = 1 ; j < = n ; j + + ) cin > > a [ i ] [ j ] ; for ( int i = 1 ; i < = m ; i + + ) for ( int j = 1 ; j < = n ; j + + ) { sum [ i ] [ j ] = a [ i ] [ j ] + sum [ i- 1 ] [ j ] + sum [ i ] [ j- 1 ] -sum [ i- 1 ] [ j- 1 ] ; / / printf ( "sum[%d][%d]=%d\n" , i , j , sum [ i ] [ j ] ) ; } for ( int i = 1 ; i

lintcode :搜索二维矩阵

两盒软妹~` 提交于 2020-01-29 00:55:34
题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n 矩阵中的值。 这个矩阵具有以下特性: 每行中的整数从左到右是排序的。 每行的第一个数大于上一行的最后一个整数。 样例 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3 ,返回 true 挑战 O(log(n) + log(m)) 时间复杂度 解题: 更新730 直接二分查找 public boolean searchMatrix(int[][] A, int target) { // write your code here if(A == null || A.length == 0 || A[0].length ==0) return false; int row = A.length; int col = A[0].length; int len = row * col; int left = 0; int right = len-1 ;// while(left <= right){ int mid = left + (right - left)/2; int x = A[mid/col][mid%col]; if(x==target){ return true; }else if(x>target){ right =

sift算法原理解析

感情迁移 提交于 2020-01-28 21:41:22
尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun 转自: http://blog.csdn.net/zddblog/article/details/7521424 对于初学者,从 David G.Lowe 的论文到实现,有许多鸿沟,本文帮你跨越。 1 、 SIFT 综述 尺度不变特征转换 (Scale-invariant feature transform 或 SIFT) 是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe 在 1999 年所发表, 2004 年完善总结。 其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、 3D 模型建立、手势辨识、影像追踪和动作比对。 此算法有其专利,专利拥有者为英属哥伦比亚大学。 局部影像特征的描述与侦测可以帮助辨识物体, SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT 特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要 3 个以上的 SIFT 物体特征就足以计算出位置与方位

最大子矩阵(二维前缀和、多重循环小优化)

余生颓废 提交于 2020-01-28 21:04:48
题目链接: 点击这里 二维前缀和预处理,四重循环超时。 最内层循环加 b r e a k break b r e a k ,AC代码: # include <iostream> # include <algorithm> # include <string> # include <cstdio> # include <cstring> # include <cmath> # include <stack> # include <queue> # include <map> # include <set> using namespace std ; typedef long long ll ; const int MOD = 10000007 ; const int INF = 0x3f3f3f3f ; const double PI = acos ( - 1.0 ) ; const int maxn = 300 ; int n , m , k , x ; ll sum [ maxn ] [ maxn ] ; int main ( ) { bool flag = false ; scanf ( "%d%d%d" , & n , & m , & k ) ; for ( register int i = 1 ; i <= n ; ++ i ) { for ( register int j

激光炸弹-二维前缀和

ⅰ亾dé卋堺 提交于 2020-01-28 00:45:10
一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标。 现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi。 激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆炸范围,即那个边长为 R 的正方形的边必须和x,y轴平行。 若目标位于爆破正方形的边上,该目标不会被摧毁。 求一颗炸弹最多能炸掉地图上总价值为多少的目标。 输入格式 第一行输入正整数 N 和 R ,分别代表地图上的目标数目和正方形的边长,数据用空格隔开。 接下来N行,每行输入一组数据,每组数据包括三个整数Xi,Yi,Wi,分别代表目标的x坐标,y坐标和价值,数据用空格隔开。 输出格式 输出一个正整数,代表一颗炸弹最多能炸掉地图上目标的总价值数目。 数据范围 0≤R≤109 0<N≤10000, 0≤Xi,Yi≤5000 0≤Wi≤1000 输入样例: 2 1 0 0 1 1 1 1 输出样例: 1 题意:用一个正方形去选择该面积中最大价值的一块。 做法:利用二维前缀和维护。 递推式: f [ i ] [ j ] = f [ i − 1 ] [ j ] + f [ i ] [ j − 1 ] − f [ i − 1 ] [ j − 1 ] + f [ i ] [ j ] f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j

28. 搜索二维矩阵

依然范特西╮ 提交于 2020-01-27 18:57:11
Note 两次二分查找,第一次二分是为了确定target可能在哪一行,第二次二分是为了确定target是否存在二维矩阵中。其中要注意,第一次二分后的right,就是它可能存在的行号。其他的,就注意vector<vector> vec的使用方法。vec.size()是一维长度,vec[n].size()是第n维长度。正常表示其中的元素就和普通的二维数组一样即可,即vec[m][n]。 class Solution { public : /** * @param matrix: matrix, a list of lists of integers * @param target: An integer * @return: a boolean, indicate whether matrix contains target */ bool searchMatrix ( vector < vector < int >> & matrix , int target ) { int len = matrix . size ( ) ; if ( target > matrix [ len - 1 ] [ matrix [ len - 1 ] . size ( ) - 1 ] || target < matrix [ 0 ] [ 0 ] ) return false ; int mid ,

c++二维vector用特定元素排序时sort中cmp的重写

China☆狼群 提交于 2020-01-27 15:12:26
Method 1: class Solution { public : vector < int > filterRestaurants ( vector < vector < int >> & restaurants , int veganFriendly , int maxPrice , int maxDistance ) { int size = restaurants . size ( ) ; vector < vector < int >> res ; for ( int i = 0 ; i < size ; i ++ ) { if ( ( veganFriendly == 1 && restaurants [ i ] [ 2 ] == 0 ) || restaurants [ i ] [ 3 ] > maxPrice || restaurants [ i ] [ 4 ] > maxDistance ) { continue ; } res . push_back ( restaurants [ i ] ) ; } sort ( res . begin ( ) , res . end ( ) , [ ] ( const auto & a , const auto & b ) { return ( a [ 1 ] > b [ 1 ] ) || ( a [ 1 ] == b

如何理解高维空间

北慕城南 提交于 2020-01-27 15:04:44
如何理解高维空间 超空间理论宣称,有超越人们普遍接受的四维时空的维度存在,宇宙可能确实存在于高维空间中。对此的认识,在世界范围内——包括好几名诺贝尔奖得主中正在扩大。用科学术语来说,超空间理论是以卡鲁查-克莱茵理论和超引力的名称出现的,它的最高级的表述形式被叫为超弦理论。 这一理论甚至预言了精确的维度:10维。通常的4维即空间的3维(长、宽和高)和时间的1维,现在被6个更加宽广的维度所扩展(当然,有些物理学家似乎认为26维更为合理,因为弦只能在10维和26维中自洽的振动)。超弦理论所涉及到的高维空间概念极大的冲击了我们现有的宇宙观,但不可否认的是,这一点已逐渐成为物理学界的主流认识:宇宙可能确实存在于高维空间中。 对我们世界的认识,最牢固的常识性观念可能就是:世界是三维的。不言而喻,长、宽和高已经足以描述我们可见宇宙的所有物体。婴儿和动物实验已经证明,我们固有的观念——世界是三维的——可谓与生俱来。如果我们把时间作为另一维包含进来,那么四维足以记录宇宙中的所有事件。不管我们的仪器探测到哪里,从原子内部直到最遥远的星系团,我们所发现的都是这四维的踪迹。在这样根深蒂固观念的影响下,理解宇宙可能确实存在于高维空间中,这一点变得异常困难。通过观察二维世界中的现象,我们或许能对这一问题有更加直观的认识。 假设有一个二维世界,它是一个巨大的平面。在这个世界里,生活着二维生物,我们称之为“平面人

二维前缀和模板题

自作多情 提交于 2020-01-25 23:00:02
输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数n,m,q。 接下来n行,每行包含m个整数,表示整数矩阵。 接下来q行,每行包含四个整数x1, y1, x2, y2,表示一组询问。 输出格式 共q行,每行输出一个询问的结果。 数据范围 1 ≤ n , m ≤ 1000 1 ≤ q ≤ 200000 , 1 ≤ x 1 ≤ x 2 ≤ n , 1 ≤ y 1 ≤ y 2 ≤ m − 1000 ≤ 矩 阵 内 元 素 的 值 ≤ 1000 输入样例: 3 4 3 1 7 2 4 3 6 2 8 2 1 2 3 1 1 2 2 2 1 3 4 1 3 3 4 输出样例: 17 27 21AC代码 #pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c

CodeForces - 467C George and Job(二维dp)

半腔热情 提交于 2020-01-23 21:33:45
题目链接: 点击查看 题目大意:给出n个数,现在要从中选取k段长度为m的不相交的子数列,问如何选择能使得覆盖的数之和最大 题目分析:读完题之和就感觉是个dp题,但不会呀,去看了题解才会的。。 因为要选取某一段的子数列之和,所以在输入的时候维护好前缀和,dp[ i ][ j ] 为到第 i 个数为止,选了 j 段后的最大值,则转移方程为: dp[ i ][ j ] = max ( dp[ i - 1 ][ j ] , dp[ i-m ][ j-1 ] + sum[ i ] - sum [ i-m ] ) 最后dp[ n ][ k ]就是答案了 代码: #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<set> #include<cmath> #include<sstream> #include<unordered_map> using namespace std; typedef long long LL; const LL inf=0x3f3f3f3f3f3f3f3f; const int N=5e3+100;