二维

二维前缀和差分+离散化

时光总嘲笑我的痴心妄想 提交于 2019-11-30 05:47:29
/* 二维前缀和求法 a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1]; 构建前缀和 int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){//初始化 for(int j=1;j<=m;j++){ int x; scanf("%d",&x); a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1]+x; } } 输入n m 以及初始值 进行查询 xx yy的格子最大值为多少 */ include include using namespace std; const int maxn=1e4+5; int a[maxn][maxn]; int b[maxn][maxn]; int main(){ int n,m,q;//n*m格子,进行q次询问 scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){//初始化 for(int j=1;j<=m;j++){ int x; scanf("%d",&x); a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1]+x; } } int xx,yy; int ans=0; scanf("%d%d",&xx,&yy); for(int i=xx;i<=n;i++){ for(int

【二维前缀和】

元气小坏坏 提交于 2019-11-30 05:40:04
https://nanti.jisuanke.com/t/31434 直接搬题解: https://www.cnblogs.com/dilthey/p/9757781.html 考虑普通的 d p [ i ] [ j ] = ∑ a = L + 1 i ∑ b = D + 1 j ( ( a == i & & b == j ) ? 0 : d p [ a ] [ b ] ) dp[i][j]=∑a=L+1i∑b=D+1j((a==i&&b==j)?0:dp[a][b]),显然就是一整个大方块去掉一小格求和, 其中, D = max ( 0 , i − k − 1 ) D=max(0,i−k−1) 为下开边界, L = max ( 0 , j − k − 1 ) L=max(0,j−k−1) 为左开边界, 如果我们老老实实的纯暴力DP,显然就是 O ( W H K 2 ) O(WHK2) 的时间复杂度,能过有鬼…… 需要使用前缀和优化,不妨假设 s u m [ i ] [ j ] = ∑ a = 1 i ∑ b = 1 j d p [ a ] [ b ] sum[i][j]=∑a=1i∑b=1jdp[a][b], 那么,显然有状态转移方程 d p [ i ] [ j ] = ( s u m [ i − 1 ] [ j ] + s u m [ i ] [ j − 1 ] − s u m

P3688 [ZJOI2017] 树状数组 【二维线段树】

 ̄綄美尐妖づ 提交于 2019-11-30 04:19:31
题目描述:这里有一个写挂的树状数组: 有两种共 \(m\) 个操作: 输入 \(l,r\) ,在 \([l,r]\) 中随机选择一个整数 \(x\) 执行 \(\text{Add}(x)\) 输入 \(l,r\) ,询问执行 \(\text{Query}(l,r)\) 的答案正确的概率 \(\text{mod} \ 998244353\) 。 数据范围: \(n,m\leq 100000\) 首先,根据这个代码,我们知道这就是一个单点修改求后缀和的数据结构。所以 \(\text{Query}(l,r)\) 求的是 \([l-1,r-1]\) 的和。所以正确当且仅当 \(a_{l-1}=a_r\) 。 注意,如果你直接维护每个数为 \(0,1\) 的概率,就会出现可能多次修改的问题。所以要 \((x,y)\) 维护 \(a_x\neq a_y\) 的概率。我们知道 \(a_x\neq a_y\) 的概率为 \(p\) ,并以 \(q\) 的概率修改,则之后的概率为 \(p(1-q)+q(1-p)\) ,这个标记是可合并的。所以: 若 \(x\in [1,l-1],y\in [l,r]\) 或 \(x\in [l,r],y\in [r+1,n]\) ,则以 \(\frac{1}{r-l+1}\) 的概率修改。 若 \(x,y\in [l,r]\) ,则以 \(\frac{2}{r-l

c++背包九讲之二维费用背包问题

雨燕双飞 提交于 2019-11-30 03:17:19
一、背包九讲总述 关于动态规划问题,最典型的就是背包九讲,先理解背包九讲后再总结关于动态规划的问题 1、01背包问题 2、完全背包问题 3、多重背包问题 4、混合背包问题 5、二维费用的背包问题 6、分组背包问题 7、背包问题求方案数 8、求背包问题的方案 9、有依赖的背包问题 往前四篇博文已经介绍了前四个问题,有需要的同学可以看一下!! 二、二维费用背包问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用,选择这件物品必 须同时付出这两种费用。对于每种费用都有一个可付出的最大值(背包容量)。问怎样 选择物品可以得到最大的价值。 故:对于01背包问题、完全背包问题和多重背包问题的方法都完全可以使用,只不过增加一个代价 接下来,01背包问题为例进行解答: 题目描述: 有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M。每件物品 只能用一次 。体积是 v[i],重量是 w[i],价值是 money[i]。 求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。输出最大价值。 输入格式 : 第一行3个整数,n,C, W,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。 接下来有 n 行,每行三个整数 v[i],w[i],money[i],用空格隔开,分别表示第 i 件物品的体积、重量和价值。

AcWing 126. 最大的和(二维前缀和)

我的梦境 提交于 2019-11-30 00:27:12
传送门 #include <bits/stdc++.h> using namespace std; const int MAXN = 110; int sum[MAXN][MAXN], N; int main() { //freopen("in", "r", stdin); ios::sync_with_stdio(false); cin.tie(0); cin >> N; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) cin >> sum[i][j]; } for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1]; } int ans = -0x3f3f3f3f; for (int x1 = 1; x1 <= N; x1++) { for (int y1 = 1; y1 <= N; y1++) { for (int x2 = 1; x2 < x1; x2++) { for (int y2 = 1; y2 < y1; y2++) ans = max(ans, sum[x1][y1] - sum[x2][y1] - sum

【二维动态规划】HDU-1176 免费馅饼

对着背影说爱祢 提交于 2019-11-29 19:41:13
注解 1、本题类似于数塔的思想,从下往上找! 2、dp[i],[j]表示第j秒第i个位置的馅饼数。 3、起始位置是5,所以最后要输出的是dp[0],[5] 代码 #include <iostream> #include <cstring> using namespace std; const int ROW = 100000; const int COL = 11; int dp[ROW][COL]; int main() { int n; scanf("%d", &n); while(n) { memset(dp, 0, sizeof(dp)); for(int i=0; i<n; i++) { int x, T; scanf("%d %d", &x, &T); dp[T][x]++; } for(int i=ROW-2; i>=0; i--) { dp[i][0] += max(dp[i+1][0], dp[i+1][1]); dp[i][10] += max(dp[i+1][9], dp[i+1][10]); for(int j=1; j<10; j++) { int tmpMax = max(dp[i+1][j-1], dp[i+1][j]); tmpMax = max(tmpMax, dp[i+1][j+1]); dp[i][j] += tmpMax; } }

前缀和、二维前缀和与差分

一曲冷凌霜 提交于 2019-11-29 17:56:21
【引入】 首先给出一个问题: 给定n个数,再给出m个询问,每个询问给出区间Li,Ri和x,要求你在Li到Ri上每一个值都加上x,最后给出一个询问区间L,R的区间和,怎么办? 思考一下:如果暴力,最坏时间复杂度O(n^2);线段树或者树状数组,时间复杂度O(logn);而使用差分可以O(n)。 要使用差分,首先我们来谈谈前缀和。 【前缀和】 什么是前缀和?前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。 设b[]为前缀和数组,a[]为原数组,根据这句话可以得到前缀和的定义式和递推式: 一维前缀和理解起来比较容易,二维前缀和后边细说,我们先来说说差分。 【差分】 什么是差分?差分是一个数组相邻两元素的差,一般为下标靠后的减去靠前的一个。 设差分数组p[],即: 差分是将数列中的每一项分别与前一项数做差, 例如: 一个序列1 2 5 4 7 3,差分后得到1 1 3 -1 3 -4 -3 这里注意得到的差分序列第一个数和原来的第一个数一样(相当于第一个数减0) 差分序列最后比原序列多一个数(相当于0减最后一个数) 性质: 1、差分序列求前缀和可得原序列 2、将原序列区间[L,R]中的元素全部+1,可以转化操作为差分序列L处+1,R+1处-1 3、按照性质2得到,每次修改原序列一个区间+1,那么每次差分序列修改处增加的和减少的相同 【联系】 前缀和和差分有什么关系呢?

MATLAB之图像与音频信号处理

帅比萌擦擦* 提交于 2019-11-29 14:27:41
原理简介 离散傅立叶、离散余弦和离散小波变换是图像、音频信号常用基础操作,时域信号转换到不同变换域以后,会导致不同程度的能量集中,信息隐藏利用这个原理在变换域选择适当位置系数进行修改,嵌入信息,并确保图像、音频信号经处理后感官质量无明显变化。 变换定义 一维离散傅立叶变换对定义: 一维离散余弦变换对定义: 一维连续小波变换对定义: 二维离散傅立叶变换对定义: 二维离散余弦变换对定义: 用离散傅立叶变换分析合成音频和图像 分析合成音频文件包括以下步骤: l 读取音频文件数据 l 一维离散傅立叶变换 l 一维离散傅立叶逆变换 l 观察结果 第一步:读取音频文件数据 新建一个 m 文件,另存为 example11.m,输入以下命令: clc; clear; len = 40000; [fn, pn] = uigetfile('*.wav', '请选择音频文件'); [x, fs] = wavread(strcat(pn, fn), len); uigetfile 是文件对话框函数,提供图形界面供用户选择所需文件,返回目标的目录名和文件名。 函数原型:y= wavread (FILE) 功能:读取微软音频格式(wav)文件内容 输入参数:file 表示音频文件名,字符串 返回参数:y 表示音频样点,浮点型 第二步:一维离散傅立叶变换 新建一个 m 文件,另存为 example12.m

matlab二维插值绘制地貌图

泪湿孤枕 提交于 2019-11-29 14:26:02
clear clc [x,y]=meshgrid(1:10); % 测量数据 h=[0 .02 -.12 0 -2.09 0 -.58 -.08 0 0; .02 0 0 -2.38 0 -4.96 0 0 0 -.1; 0 .1 1 0 -3.04 0 -.53 0 .1 0 ; 0 0 0 3.52 0 0 0 0 0 0; -.43 -1.98 0 0 0 .77 0 2.17 0 0; 0 0 -2.29 0 .69 0 2.59 0 .3 0; -.09 -.31 0 0 0 4.27 0 0 0 -.01; 0 0 0 5.13 7.4 0 1.89 0 .04 0 ; .1 0 .58 0 0 1.75 0 -.11 0 0 ; 0 -.01 0 0 .3 0 0 0 0 .01]; [xi,yi]=meshgrid(1:.1:10); hi=interp2(x,y,h,xi,yi,'spline'); % 二维插值,三次样条插值 surf(hi) % 绘制地貌图 xlabel('x'),ylabel('y'),zlabel('h') 来源: https://blog.csdn.net/qq_36607894/article/details/100021016

搜索二维矩阵

余生长醉 提交于 2019-11-29 12:43:24
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted from left to right. The first integer of each row is greater than the last integer of the previous row. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/search-a-2d-matrix 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 要求在一个二维矩阵找出目标数。借鉴其中一个题解的做法,从右上角开始遍历,目标数比右上角的数大,证明不在当前一行,行数+1;目标数比右上角的数小,证明不在当前一列,列数-1: public boolean searchMatrix(int[][] matrix, int target) { if(matrix == null || matrix.length == 0) { return false; } int row = 0; int col = matrix[0]