2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。
2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。
福大大 答案2021-05-06:
自然智慧即可。
动态规划。二维数组的所有位置,每个位置上下左右全部试一次。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
matrix := [][]int{{1, 2, 3}, {6, 5, 4}}
ret := 0
ret = longestIncreasingPath1(matrix)
fmt.Println(ret)
ret = longestIncreasingPath2(matrix)
fmt.Println(ret)
}
func longestIncreasingPath1(matrix [][]int) int {
ans := 0
N := len(matrix)
M := len(matrix[0])
for i := 0; i < N; i++ {
for j := 0; j < M; j++ {
ans = getMax(ans, process1(matrix, i, j))
}
}
return ans
}
// 从m[i][j]开始走,走出来的最长递增链,返回!
func process1(m [][]int, i int, j int) int {
up := 0
if i > 0 && m[i][j] < m[i-1][j] {
up = process1(m, i-1, j)
}
down := 0
if i < (len(m)-1) && m[i][j] < m[i+1][j] {
down = process1(m, i+1, j)
}
left := 0
if j > 0 && m[i][j] < m[i][j-1] {
left = process1(m, i, j-1)
}
right := 0
if j < (len(m[0])-1) && m[i][j] < m[i][j+1] {
right = process1(m, i, j+1)
}
return getMax(getMax(up, down), getMax(left, right)) + 1
}
func longestIncreasingPath2(matrix [][]int) int {
ans := 0
N := len(matrix)
M := len(matrix[0])
dp := make([][]int, N)
for i := 0; i < N; i++ {
dp[i] = make([]int, M)
}
for i := 0; i < N; i++ {
for j := 0; j < M; j++ {
ans = getMax(ans, process2(matrix, i, j, dp))
}
}
return ans
}
// 从m[i][j]开始走,走出来的最长递增链,返回!
func process2(m [][]int, i int, j int, dp [][]int) int {
//fmt.Println("i=", i, ",j=", j)
if dp[i][j] != 0 {
return dp[i][j]
}
// (i,j)不越界
up := 0
if i > 0 && m[i][j] < m[i-1][j] {
process2(m, i-1, j, dp)
}
down := 0
if i < (len(m)-1) && m[i][j] < m[i+1][j] {
down = process2(m, i+1, j, dp)
}
left := 0
if j > 0 && m[i][j] < m[i][j-1] {
left = process2(m, i, j-1, dp)
}
right := 0
if j < (len(m[0])-1) && m[i][j] < m[i][j+1] {
right = process2(m, i, j+1, dp)
}
ans := getMax(getMax(up, down), getMax(left, right)) + 1
dp[i][j] = ans
return ans
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:

2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。的更多相关文章
- c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点
//题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...
- 找出一个二维数组中的"鞍点",即该位置上的元素在该行中最大,在该列中最小(也可能没有"鞍点"),打印有关信息.(提示:注意特殊情况:没鞍点或多个鞍点)
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ][] = {}; ;i < ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组
13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...
- new一个二维数组
.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] = new char[y]; ...用的时候 ...
- php中向前台js中传送一个二维数组
在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...
- JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数
JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数 示例如下 至少需要九个元素:"A","B","C",&q ...
- 如何用一个for循环打印出一个二维数组
思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...
- C语言程序,找出一个二维数组的鞍点。
什么是鞍点????? 鞍点就是在一个二维数组中,某一个数在该行中最大,然而其在该列中又是最小的数,这样的数称为鞍点. 昨天突然在书上看到这样的一道题,就自己尝试着写了一个找出一个二维数组中的鞍点. 好 ...
- <转载>c++中new一个二维数组
原文连接 在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int byte long... 1.dataType (*num)[n] = n ...
随机推荐
- 总项目的pom文件
注意修改子模块名称!!!!!!!!!!!!!!!!!!<?xml version="1.0" encoding="UTF-8"?> <proj ...
- rosetta Resfile语法和约束
介绍 参考:https://www.rosettacommons.org/docs/latest/rosetta_basics/file_types/resfiles resfile包含输入到Pack ...
- spring aop切面说明
execution:处理Join Point的类型,例如call.execution (* android.app.Activity.on**(..)):这个是最重要的表达式,第一个*表示返回值,*表 ...
- vulnhub靶场之MOMENTUM: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:Momentum: 1,下载地址:https://download.vulnhub.com/momentum/Momentum.ova,下载后直 ...
- wx.BoxSizer布局管理器用法,及其Add()方法参数说明
wx.BoxSizer 布局管理器是一种常见的布局管理器,它可以在水平或垂直方向上布置子窗口部件.同时,它还可以在水平或垂直方向上包含其他 wx.BoxSizer 来创建复杂的布局. 下面是 wx.B ...
- redo log的用处
redo log用途 1. 用途 保证数据的更新操作不丢失,同时保证了性能 2. 如何没有redo log,如何保证数据库的更新操作不会由于数据库的宕机而丢失? 对数据库进行修改,应该是先从磁盘读取数 ...
- 字符串算法--$\mathcal{KMP,Trie}$树
\(\mathcal{KMP算法}\) 实际上,完全没必要从\(S\)的每一个字符开始,暴力穷举每一种情况,\(Knuth.Morris\)和\(Pratt\)对该算法进行了改进,称为KMP算法. 而 ...
- 介绍ChatGPT:基于GPT-3.5的强大自然语言处理工具
大家好,今天我们来聊一下ChatGPT,一个基于GPT-3.5架构的大型语言模型.ChatGPT在自然语言处理方面有着非常强大的能力,可以进行语言生成.文本分类.对话生成等多种任务.接下来,我们将会详 ...
- 重磅!Apache Hudi联合传智教育推出免费中文视频教程
基础介绍 Apache Hudi(简称:Hudi)使得您能在hadoop兼容的存储之上存储大量数据,同时它还提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理.这两种原语分别是: Up ...
- 鼎捷ERP二次开发教程 Tiptop GP开发资料大全 Tipto开发实战经验 鼎捷开发实战例子 Tiptop GP二次开发项目例子 4GL开发Demo 鼎捷二次开发完整例子 鼎捷ERP二次开发入门
本人在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,非常熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案. 曾经参与鼎捷Tiptop GP实施十多个项目,具 ...