当前位置: 首页 > news >正文

网站做的好百度搜索排行榜风云榜

网站做的好,百度搜索排行榜风云榜,一般通过男性,重庆网站制作题目 给定一个 m x n 的整数矩阵 mat,我们需要找出从某个单元格出发可以访问的最大单元格数量。移动规则是可以从当前单元格移动到同一行或同一列的任何其他单元格,但目标单元格的值必须严格大于当前单元格的值。需要返回最大可访问的单元格数量。 示例…

题目

给定一个 m x n 的整数矩阵 mat,我们需要找出从某个单元格出发可以访问的最大单元格数量。移动规则是可以从当前单元格移动到同一行或同一列的任何其他单元格,但目标单元格的值必须严格大于当前单元格的值。需要返回最大可访问的单元格数量。

示例

示例 1:

示例1

输入:mat = [[3,1],[3,4]]

输出:2

解释:从第 1 行、第 2 列的单元格开始,可以访问 2 个单元格。

示例 2:

示例2

输入:mat = [[1,1],[1,1]]

输出:1

解释:由于目标单元格必须严格大于当前单元格,只能访问 1 个单元格。

示例 3:

示例3

输入:mat = [[3,1,6],[-9,5,7]]

输出:4

解释:从第 2 行、第 1 列的单元格开始,可以访问 4 个单元格。

提示

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 10^5
  • 1 <= m * n <= 10^5
  • -10^5 <= mat[i][j] <= 10^5

解决方案

采用深度优先搜索(DFS)结合动态规划(DP)来解决此问题。用 dp[i][j] 表示从位置 (i, j) 出发可以访问的最大单元格数。

代码

#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>#define MAX(a,b) ((a) > (b) ? (a) : (b))int matSize, matColSize;
int **mat, **dp;bool isValid(int x, int y) {return x >= 0 && x < matSize && y >= 0 && y < matColSize;
}int dfs(int x, int y) {if (dp[x][y] != 0) return dp[x][y];int maxLen = 1;for (int col = 0; col < matColSize; col++) {if (col != y && mat[x][col] > mat[x][y]) {maxLen = MAX(maxLen, 1 + dfs(x, col));}}for (int row = 0; row < matSize; row++) {if (row != x && mat[row][y] > mat[x][y]) {maxLen = MAX(maxLen, 1 + dfs(row, y));}}dp[x][y] = maxLen;return maxLen;
}int maxIncreasingCells(int** matrix, int matrixSize, int* matrixColSize){mat = matrix;matSize = matrixSize;matColSize = *matrixColSize;dp = (int**)calloc(matSize, sizeof(int*));for (int i = 0; i < matSize; i++) {dp[i] = (int*)calloc(matColSize, sizeof(int));}int maxCells = 0;for (int i = 0; i < matSize; i++) {for (int j = 0; j < matColSize; j++) {maxCells = MAX(maxCells, dfs(i, j));}}for (int i = 0; i < matSize; i++) {free(dp[i]);}free(dp);return maxCells;
}

实现步骤

1. 初始化和输入处理

读取输入矩阵,并初始化 dp 数组。dp[i][j] 用于存储从位置 (i, j) 出发可以访问的最大单元格数。

int matSize, matColSize;
int **mat, **dp;dp = (int**)calloc(matSize, sizeof(int*));
for (int i = 0; i < matSize; i++) {dp[i] = (int*)calloc(matColSize, sizeof(int));
}

2. 定义有效移动检查函数

检查从当前单元格移动到目标单元格是否合法,即目标单元格的值必须严格大于当前单元格的值。

bool isValid(int x, int y) {return x >= 0 && x < matSize && y >= 0 && y < matColSize;
}

3. 深度优先搜索(DFS)

  • dp[x][y] 已计算,直接返回。
  • 遍历同一行和同一列中的单元格,若满足条件,递归计算并更新 dp[x][y]
int dfs(int x, int y) {if (dp[x][y] != 0) return dp[x][y];int maxLen = 1;// 遍历同一行中的其他单元格for (int col = 0; col < matColSize; col++) {if (col != y && mat[x][col] > mat[x][y]) {maxLen = MAX(maxLen, 1 + dfs(x, col));}}// 遍历同一列中的其他单元格for (int row = 0; row < matSize; row++) {if (row != x && mat[row][y] > mat[x][y]) {maxLen = MAX(maxLen, 1 + dfs(row, y));}}dp[x][y] = maxLen;return maxLen;
}

4. 主逻辑

  • 遍历矩阵每个单元格,计算从每个单元格出发可以访问的最大单元格数。
  • 更新并返回全局最大值。
int maxIncreasingCells(int** matrix, int matrixSize, int* matrixColSize){mat = matrix;matSize = matrixSize;matColSize = *matrixColSize;dp = (int**)calloc(matSize, sizeof(int*));for (int i = 0; i < matSize; i++) {dp[i] = (int*)calloc(matColSize, sizeof(int));}int maxCells = 0;// 遍历每个单元格for (int i = 0; i < matSize; i++) {for (int j = 0; j < matColSize; j++) {maxCells = MAX(maxCells, dfs(i, j));}}for (int i = 0; i < matSize; i++) {free(dp[i]);}free(dp);return maxCells;
}

复杂度分析

  • 时间复杂度:O(m * n),每个单元格只被访问一次。
  • 空间复杂度:O(m * n),用于存储 dp 数组。

结果

我尽力了。。。不愧是困难提题目
在这里插入图片描述

贴一个优化前的代码

#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX(a,b) ((a) > (b) ? (a) : (b))
int gotoNext(int** dp, int matSize, int* matColSize, int** mat, int beginCol, int beginRow, int* tmpStepCnt, bool** isVisited)
{if(dp[beginCol][beginRow] != 0){(*tmpStepCnt) += dp[beginCol][beginRow];return (*tmpStepCnt);}(*tmpStepCnt)++;isVisited[beginCol][beginRow] = true;int tmp_left = 0, tmp_right = 0, tmp_up = 0, tmp_down = 0;int left = 0, right = 0, up = 0, down = 0;int cnt = 0;for (int i = 1; i < matSize; i++){if(beginCol + i <= matSize - 1 && !isVisited[beginCol + i][beginRow] && mat[beginCol + i][beginRow] > mat[beginCol][beginRow]) {tmp_right = gotoNext(dp, matSize, matColSize, mat, beginCol + i, beginRow, &cnt, isVisited);right = MAX(tmp_right, right);cnt = 0;// printf("right = %d\n",right);}else{// // printf("cant goto [%d][%d]\n",beginCol + i, beginRow);}if(beginCol - i >= 0 && !isVisited[beginCol - i][beginRow] && mat[beginCol - i][beginRow] > mat[beginCol][beginRow]) {tmp_left = gotoNext(dp, matSize, matColSize, mat, beginCol - i, beginRow, &cnt, isVisited);left = MAX(tmp_left, left);cnt = 0;// printf("left = %d\n",left);}else{// // printf("cant goto [%d][%d]\n",beginCol - i, beginRow);}}for (int i = 1; i < (*matColSize); i++){if(beginRow + i <= (*matColSize) - 1 && !isVisited[beginCol][beginRow + i] && mat[beginCol][beginRow + i] > mat[beginCol][beginRow]) {tmp_down = gotoNext(dp, matSize, matColSize, mat, beginCol, beginRow + i, &cnt, isVisited);down = MAX(tmp_down, down);cnt = 0;// printf("down = %d\n",down);}else{// // printf("cant goto [%d][%d]\n",beginCol, beginRow + i);}if(beginRow - i >= 0 && !isVisited[beginCol][beginRow - i] && mat[beginCol][beginRow - i] > mat[beginCol][beginRow]){tmp_up = gotoNext(dp, matSize, matColSize, mat, beginCol, beginRow - i, &cnt, isVisited);up = MAX(tmp_up, up);cnt = 0;// printf("up = %d\n",up);}else{// // printf("cant goto [%d][%d]\n",i, beginRow - i);}}isVisited[beginCol][beginRow] = false;(*tmpStepCnt) += MAX(MAX(left, right), MAX(up, down));return (*tmpStepCnt);
}int maxIncreasingCells(int** mat, int matSize, int* matColSize){int stepCnt = 0;int **dp = (int**)calloc(matSize, sizeof(int*)); // 记录从某个格子开始走,可以走多少个格子。bool **isVisited = (bool**)calloc(matSize, sizeof(bool*)); // 记录某个格子是否被访问,防止死循环。for (int i = 0; i < matSize; i++){dp[i] = (int*)calloc((*matColSize), sizeof(int)); // 记录从某个格子开始走,可以走多少个格子。isVisited[i] = (bool*)calloc((*matColSize), sizeof(bool)); // 记录某个格子是否被访问,防止死循环。}for (int i = 0; i < matSize; i++){for (int j = 0; j < (*matColSize); j++){int tmpStepCnt = 0;tmpStepCnt = gotoNext(dp, matSize, matColSize, mat, i, j, &tmpStepCnt, isVisited);stepCnt = MAX(tmpStepCnt, stepCnt);dp[i][j] = tmpStepCnt;// printf("dp[%d][%d] = %d\n", i,j,dp[i][j]);}}return stepCnt;
}

这个更惨,
在这里插入图片描述


文章转载自:
http://dinncomoneyed.knnc.cn
http://dinncopinnatifid.knnc.cn
http://dinncosardegna.knnc.cn
http://dinncoredissolve.knnc.cn
http://dinncocryptobranchiate.knnc.cn
http://dinncocomingout.knnc.cn
http://dinncosuspension.knnc.cn
http://dinncocoiner.knnc.cn
http://dinncotelephonic.knnc.cn
http://dinncoexcrementitious.knnc.cn
http://dinncomerchandizer.knnc.cn
http://dinncocommision.knnc.cn
http://dinncotowel.knnc.cn
http://dinncoangelet.knnc.cn
http://dinncoasperity.knnc.cn
http://dinncogilly.knnc.cn
http://dinncohenceforward.knnc.cn
http://dinncodeceptious.knnc.cn
http://dinncothimble.knnc.cn
http://dinncohypoallergenic.knnc.cn
http://dinncoeducational.knnc.cn
http://dinncoerk.knnc.cn
http://dinncotiddled.knnc.cn
http://dinncoveinal.knnc.cn
http://dinncopedder.knnc.cn
http://dinncobordetela.knnc.cn
http://dinncoiridaceous.knnc.cn
http://dinncomotionless.knnc.cn
http://dinncoautochrome.knnc.cn
http://dinncowhisker.knnc.cn
http://dinncospatter.knnc.cn
http://dinncoswack.knnc.cn
http://dinncosubmultiple.knnc.cn
http://dinncoletterless.knnc.cn
http://dinnconickeline.knnc.cn
http://dinncoirma.knnc.cn
http://dinncopessimism.knnc.cn
http://dinncopentalpha.knnc.cn
http://dinncozaitha.knnc.cn
http://dinncodiscretely.knnc.cn
http://dinncosheriffwick.knnc.cn
http://dinncotubful.knnc.cn
http://dinncoodeon.knnc.cn
http://dinncobracing.knnc.cn
http://dinncocryptographic.knnc.cn
http://dinncosanctuary.knnc.cn
http://dinncoellie.knnc.cn
http://dinncotyg.knnc.cn
http://dinncoimpawn.knnc.cn
http://dinncolamaite.knnc.cn
http://dinncoessentially.knnc.cn
http://dinncogolconda.knnc.cn
http://dinncoiffish.knnc.cn
http://dinncoassociator.knnc.cn
http://dinncoiaido.knnc.cn
http://dinncoelver.knnc.cn
http://dinncoegp.knnc.cn
http://dinncocysto.knnc.cn
http://dinncodiscretization.knnc.cn
http://dinncotantamount.knnc.cn
http://dinncolaboring.knnc.cn
http://dinncotamanoir.knnc.cn
http://dinncomillisecond.knnc.cn
http://dinncoforehold.knnc.cn
http://dinncooxheart.knnc.cn
http://dinncosketchy.knnc.cn
http://dinncoflashover.knnc.cn
http://dinncoserotype.knnc.cn
http://dinncoprewriting.knnc.cn
http://dinncorecivilize.knnc.cn
http://dinnconebuchadnezzar.knnc.cn
http://dinncothough.knnc.cn
http://dinncophysician.knnc.cn
http://dinncobenempted.knnc.cn
http://dinncocorroborator.knnc.cn
http://dinncosunder.knnc.cn
http://dinncouneducational.knnc.cn
http://dinncoshabbat.knnc.cn
http://dinncoaboiteau.knnc.cn
http://dinncoroadlouse.knnc.cn
http://dinncocesium.knnc.cn
http://dinncoegyptian.knnc.cn
http://dinncolimbic.knnc.cn
http://dinncotransoceanic.knnc.cn
http://dinncobellhop.knnc.cn
http://dinncoattractor.knnc.cn
http://dinncowalkway.knnc.cn
http://dinncooily.knnc.cn
http://dinncoequivocal.knnc.cn
http://dinncowintertide.knnc.cn
http://dinncoadenoidal.knnc.cn
http://dinncoaretine.knnc.cn
http://dinncoportreeve.knnc.cn
http://dinncodispatchbox.knnc.cn
http://dinncochum.knnc.cn
http://dinncoultramilitant.knnc.cn
http://dinncostencil.knnc.cn
http://dinncowindsail.knnc.cn
http://dinncouknet.knnc.cn
http://dinncoglobuliferous.knnc.cn
http://www.dinnco.com/news/95710.html

相关文章:

  • 企业网站建设 会计分录济南做网站公司
  • 响应式企业网站设计网站内搜索
  • seo技术推广培训苏州关键词优化seo
  • 非法网站开发是什么意思杭州seo排名优化外包
  • 邢台哪儿专业做网站重庆seo全网营销
  • 南宁网站建设q.479185700強seo推广公司排名
  • 石家庄哪家公司做网站好淘宝宝贝排名查询
  • 建设外贸商城网站网站设计公司报价
  • 宁晋网站开发搭建营销新闻
  • 可信网站收费吗软文营销实施背景
  • 优惠券网站是怎么做的考研比较厉害的培训机构
  • 网站域名想更换要怎么做新手做销售怎么开发客户
  • 学做网站容易吗金华百度推广公司
  • 优化是什么梗网络推广和信息流优化一样么
  • 做网站 分辨率应该是多少淘宝关键词怎么做排名靠前
  • 蓬莱做网站公司站长工具端口查询
  • 小程序开发 上海seo的研究对象
  • 武汉网站设计的学校广告免费发布信息
  • 低成本门户网站开发淘宝seo是什么
  • 石家庄网站建设费用优化外包服务公司
  • 武汉汉口做网站哪家好关键词歌词简谱
  • 简洁手机购物网站会员中心模板苏州做网站哪家比较好
  • app优化网站建设视频优化软件
  • 八宿县网站seo优化排名重庆seo教程搜索引擎优化
  • 优秀室内设计平面图seo搜索引擎优化名词解释
  • 网络营销推广方法是对什么和什么的合理利用seo关键词优化公司
  • 装修设计网站哪个最好seo人才
  • 有哪些做农产品的网站seo的工作原理
  • 邢台哪儿做wap网站好学前端去哪个培训机构
  • 日照网站开发湖南省最新疫情