首页 > 其他分享 >2713. 矩阵中严格递增的单元格数 Hard

2713. 矩阵中严格递增的单元格数 Hard

时间:2024-06-30 20:55:44浏览次数:19  
标签:2713 单元格 mat column Hard dpRow2 dp row

给你一个下标从 1 开始、大小为 m x n 的整数矩阵 mat,你可以选择任一单元格作为 起始单元格 。

从起始单元格出发,你可以移动到 同一行或同一列 中的任何其他单元格,但前提是目标单元格的值 严格大于 当前单元格的值。

你可以多次重复这一过程,从一个单元格移动到另一个单元格,直到无法再进行任何移动。

请你找出从某个单元开始访问矩阵所能访问的 单元格的最大数量 。

返回一个表示可访问单元格最大数量的整数。

示例 1:

输入:mat = [[3,1],[3,4]]
输出:2
解释:上图展示了从第 1 行、第 2 列的单元格开始,可以访问 2 个单元格。可以证明,无论从哪个单元格开始,最多只能访问 2 个单元格,因此答案是 2 。 

示例 2:

输入:mat = [[1,1],[1,1]]
输出:1
解释:由于目标单元格必须严格大于当前单元格,在本示例中只能访问 1 个单元格。 

示例 3:

输入:mat = [[3,1,6],[-9,5,7]]
输出:4
解释:上图展示了从第 2 行、第 1 列的单元格开始,可以访问 4 个单元格。可以证明,无论从哪个单元格开始,最多只能访问 4 个单元格,因此答案是 4 。  

提示:

 ·m == mat.length 

 ·n == mat[i].length 

 ·1 <= m, n <= 105

 ·1 <= m * n <= 105

 ·-105 <= mat[i][j] <= 105

题目大意:在每次移动可以到达当前行或列中更大元素的情况下计算最多可以移动的次数。

分析:

(1)设dp[i][j]为以mat[i][j]为终点的路径中最长路径的长度,由于每次只能移动到更大的元素,因此dp[i][j]的值为所在行和列中所有比mat[i][j]小的元素对应的dp值中的最大值+1;

(2)由(1)可知计算dp[i][j]需先计算比mat[i][j]小的元素所对应的dp值,因此将mat中的每个元素放入一维数组中,根据元素大小进行排序,则可将二维dp降维,dp[i]表示以一维数组的i号元素为终点的路径中最长路径的长度。然后按从小到大的顺序更新每个元素的dp值即可,最大的dp值即为最多可以移动的次数。

class Solution {
public:
    int maxIncreasingCells(vector<vector<int>>& mat) {
        int row=mat.size(),column=mat[0].size(),N=row*column;
        vector<pair<int,int>> site;
        site.reserve(N);
        vector<int> dpRow1(row,0),dpRow2(row,0),dpColumn1(column,0),dpColumn2(column,0);
        vector<int> maxRow(row,INT_MIN),maxColumn(column,INT_MIN);
        int ans=0,num;
        for(int i=0,k=0;i<row;++i){
            for(int j=0;j<column;++j,++k) site.emplace_back(i,j);
        }
        sort(site.begin(),site.end(),[&](const pair<int,int>& p1,const pair<int,int>& p2){
            return mat[p1.first][p1.second]<mat[p2.first][p2.second];
        });
        for(auto& [x,y]:site){
            num=mat[x][y];
            if(num>maxRow[x]) dpRow1[x]=max(dpRow1[x],dpRow2[x])+1;    
            if(num>maxColumn[y]) dpColumn1[y]=max(dpColumn1[y],dpColumn2[y])+1;
            dpColumn2[y]=max(dpColumn2[y],dpRow1[x]);
            dpRow2[x]=max(dpRow2[x],dpColumn1[y]);
            ans=max({ans,dpRow2[x],dpColumn2[y]});
            maxRow[x]=maxColumn[y]=num;
        }
        return ans;
    }
};

标签:2713,单元格,mat,column,Hard,dpRow2,dp,row
From: https://blog.csdn.net/m0_60444839/article/details/140072471

相关文章

  • [题解]CF1732C2 Sheikh (Hard Version)
    思路首先证明一下当序列扩大时答案一定不劣。考虑\(f(l,r)\)到\(f(l,r+1)\)的变化。\[\begin{aligned}f(l,r)-f(l,r+1)&=s_{l,r}-xs_{l,r}-s_{l,r+1}+xs_{l,r+1}\\&=xs_{l,r+1}-xs_{l,r}-a_{r+1}\\&......
  • 批量选取不相邻单元格(同填充色)
    问题:批量选取相同填充色的不相邻的单元格查找法:开始》查找》查找》选项》格式》背景颜色》点选带背景颜色的单元格》查找全部》Ctrl+A筛选法:筛选》颜色筛选选取筛选结果》开始》查找》定位》可见单元格》定位......
  • Springboot+Vue+Mybatis-Plus+Easyexcel实现文件导入+导出的excel单元格下拉列表
    引言文件的导入与导出功能扮演着至关重要的角色,特别是在处理大量数据和复杂的表格时。通过整合SpringBoot、Vue、Mybatis-Plus和Easyexcel等先进技术,我们可以构建一个高效、灵活的文件处理系统。其中,Excel作为广泛使用的电子表格软件,其单元格下拉列表功能对于数据录入和校验......
  • (nice!!!)LeetCode 2713. 矩阵中严格递增的单元格数(动态规划、哈希表)
    2713.矩阵中严格递增的单元格数思路:1、先对数组中的元素按值从小到大处理2、对于当前的元素值,可以更新当前所在行和列的最大值。3、最后每一行或每一列的最大值即为所求值细节看注释classSolution{public:intmaxIncreasingCells(vector<vector<int>>&mat......
  • C#使用 NPOI 添加图片到 Excel 单元格
    入参:工作簿对象,某个单元格对象,将要写入的图片字节数组 对象解释:XSSFClientAnchor:可设置图片放置的开始、结束单元格,X、Y起始点位(这里挖个坑,具体设置多少可以根据行高等进行计算,具体可参考pic.Resize()的实现)///<summary>///将图片添加到工作簿///</summary>/......
  • Springboot 集成 Shardingsphere-JDBC
    Springboot集成Shardingsphere-JDBCShardingsphere系列目录:背景调研前提新增依赖分表策略简单分库分表策略垂直分库广播表水平分库(单表)水平分库(多表)水平分表HINT配置逻辑代码自定义分库分表(精准定位+范围查询)配置代码精准定位数据库精准定位+范围查询表代码仓......
  • 力扣2713 2024.6.19
    原题网址:此处为链接个人难度评价:1700分析:DP顺序很重要,从大数递推到小数保证了不会每次都是最优子结构而不会有后效性。开了个map来方便二分大于当前数的最小数,状态转移方程显然,记h[x]与l[y]表示第x行小于当前值的最优和第y列小于当前值的最优:dp[x][y]=max(f[x],l[y])注意......
  • java freemarker实现单元格动态合并
    在Java项目中,使用FreeMarker模板引擎来动态生成Excel文件,并实现单元格的动态合并(特别是行合并)。可以通过以下步骤来完成:1.准备数据模型        需要准备一个合适的数据模型,该模型应能表示出哪些单元格需要合并。        例如,如果想要根据某一列的值来决定......
  • 分库分表的介绍及常见实现方法,ShardingSphere实现分库分表示例
    分库分表的介绍分库分表是一种常见的数据库架构优化手段,主要用于解决单一数据库或单一表的数据量过大、并发读写过高的问题。下面详细介绍几种实现分库分表的方法:垂直拆分(分库)垂直分库:按照业务模块将表拆分到不同的数据库中,每个数据库负责一部分业务。优点:不同业务的数据......
  • [AGC001E] BBQ Hard
    题意求:\[\sum_{i=1}^{n}\sum_{j=i+1}^{n}\dbinom{a_i+b_i+a_j+b_j}{a_i+a_j}\]对\(10^9+7\)取模。\(n\le2\times10^5,1\lea_i\le2000,1\leb_i\le2000\)Sol简单化简一下,给她乘个\(2\),然后减去\(i=j\)的部分。\[\frac{1}{......