304. 二维区域和检索 - 矩阵不可变——动态规划

2024-03-29 19:08

本文主要是介绍304. 二维区域和检索 - 矩阵不可变——动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一维前缀和

class NumMatrix {
public:vector<vector<int>> dp;NumMatrix(vector<vector<int>>& matrix) {//一开始思考,不是每次直接加起来就好了吗//后来发现,这样消耗的时间也太多了吧,怪不得我AC不了//看了题解才知道,看起来越简单的题,越要用精妙的方法去做int rows = matrix.size(), cols = matrix[0].size();dp.resize(rows, vector<int>(cols + 1));//按行计算所处单元格的行前缀和for(auto row = 0; row < rows; ++row){for(auto col = 0; col < cols; ++col){dp[row][col + 1] = dp[row][col] + matrix[row][col];}}}int sumRegion(int row1, int col1, int row2, int col2) {int sum = 0;//每行的和就是每行col2 + 1的前缀和减去col1的前缀和for(auto i = row1; i <= row2; ++i){sum += dp[i][col2 + 1] - dp[i][col1];}return sum;}
};

Accepted
24/24 cases passed (512 ms)
Your runtime beats 8.77 % of cpp submissions
Your memory usage beats 64.22 % of cpp submissions (144.5 MB)

二维前缀和

在这里插入图片描述
如图,范围内的和为dp[i + 1][j+ 1] - dp[i + 1][j] - dp[i][j + 1] + dp[i][j]
那么重要的是dp[i][j]的普遍公式是如何得到的?
仔细思考后发现,和上面的有异曲同工之妙
dp[row + 1][col + 1] = dp[row + 1][col] + dp[row][col + 1] - dp[row][col] + matrix[row][col];

class NumMatrix {
public:vector<vector<int>> dp;NumMatrix(vector<vector<int>>& matrix) {int rows = matrix.size(), cols = matrix[0].size();dp.resize(rows + 1, vector<int>(cols + 1));for(auto row = 0; row < rows; ++row){for(auto col = 0; col < cols; ++col){dp[row + 1][col + 1] = dp[row + 1][col] + dp[row][col + 1] - dp[row][col] + matrix[row][col];}}}int sumRegion(int row1, int col1, int row2, int col2) {return dp[row2 + 1][col2 + 1] - dp[row2 + 1][col1] - dp[row1][col2 + 1] + dp[row1][col1];}
};

Accepted
24/24 cases passed (360 ms)
Your runtime beats 59.19 % of cpp submissions
Your memory usage beats 92.62 % of cpp submissions (144.4 MB)

这篇关于304. 二维区域和检索 - 矩阵不可变——动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859392

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2