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 ...
随机推荐
- Conda简单教程 - 搬运
Conda简单教程 转自:https://www.cnblogs.com/nuccch/p/15046969.html 目录 什么是Conda 安装Conda 虚拟环境管理 模块管理 何时使用Cond ...
- python练习--1
ID_CARD = input("Input your ID Card: ") length = len(ID_CARD) if length < 5: NEW_ID_CAR ...
- SublimeText实现Markdown快速预览
SublimeText是什么? SublimeText是一个文本编辑器,同时也是一个先进的代码编辑器.SublimeText具有漂亮的用户界面和强大的功能,它的主要功能包括:拼写检查,书签,完整的Py ...
- Android笔记--选择按钮
复选框CheckBox 具体实现: 注意: 开关按钮switch 具体实现: 单选按钮RadioButton 需要放到radioGroup里面写单选按钮 具体实现:
- ChatGPT对于滤除微多普勒运动目标的解决方案
上一篇体验了一把GPT的真香定律,赶紧又问了一些同事问的如何滤除微多普勒目标的问题.感觉还可以,后面可以试试看,具体大家可以一起看看这个回答,还是有一些可以采纳的意见(文章内容为GPT回答的内容,可能 ...
- # 1. C++概述
1. C++概述 1.1 c++简介 "c++"中的++来自于c语言中的递增运算符++,该运算符将变量加1.c++起初也叫"c with clsss".通过名称 ...
- 一文学会Flex布局
参考: <CSS权威指南>(第四版) flex布局教程-语法篇-阮一峰 1.Flex布局是什么 FlexBox,弹性盒布局,顾名思义,就是元素具有弹性,能根据可用空间大小增减尺寸. 2.基 ...
- Scanner进阶用法
Scanner进阶用法 判断是否为整数,浮点数 package charpter2; import java.util.Scanner; public class Scanner3 { public ...
- vue中新的状态管理器-pinia
背景 对于pinia的使用,可参考官方文档在这不做过多赘述.这边主要来讲讲pinia中 少用且好用的方法,为什么我们选择pinia而不用vuex ps: 以下写法全部基于组合式API 使用方式: 先下 ...
- golang pprof 监控系列(4) —— goroutine thread 统计原理
golang pprof 监控系列(4) -- goroutine thread 统计原理 大家好,我是蓝胖子. 在之前 golang pprof监控 系列文章里我分别介绍了go trace以及go ...