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 ...
随机推荐
- EF6 Code First Migrations
参考地址:https://learn.microsoft.com/en-us/ef/ef6/modeling/code-first/migrations/ 1.启动Migrations Enable- ...
- NDVI批量处理排除值-3000
代码如下: import arcpy from arcpy import env from arcpy.sa import * import sys reload(sys) sys.setdefaul ...
- tomcat非配置项的策略问题
引用自:http://yaoyan.me/2017/04/Tomcat-config1/ tomcat非配置项的策略问题,参考官方文档:Non-Tomcat setting 大意如下: Tomcat配 ...
- ElasticSearch 实现分词全文检索 - Scroll 深分页
目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...
- java常用的数据类型有哪些
前言 在上一篇文章中,壹哥给大家讲解了Java中变量的定义.使用及基本原理等内容,这个内容并不是很难,但却是我们走向Java大神的第一步!壹哥希望你从第一天就要认真对待哦. 在前面讲解变量时,壹哥给大 ...
- 循序渐进讲解负载均衡vivoGateway(VGW)
作者:vivo 互联网运维团队- Duan Chengping 在大规模业务场景中,已经不可能通过单机提供业务,这就衍生出了负载均衡的需求.为了满足合适可靠的负载,本文将从简单的基础需求出发,一步步推 ...
- 二进制安装Kubernetes(k8s) v1.26.0 IPv4/IPv6双栈
二进制安装Kubernetes(k8s) v1.26.0 IPv4/IPv6双栈 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 ...
- 11.spring security 认证和授权简单流程了解
1.总结:昨天主要是对WebSecurityConfigurerAdaptor的三个函数的区分以及了解了spring security的认证和授权流程:再就是动手使用了下thymeleaf和freeM ...
- SpringBoot整合RocketMQ,老鸟们都是这么玩的!
今天我们来讨论如何在项目开发中优雅地使用RocketMQ.本文分为三部分,第一部分实现SpringBoot与RocketMQ的整合,第二部分解决在使用RocketMQ过程中可能遇到的一些问题并解决他们 ...
- Springboot一些常用注解
Springboot启动注解 @SpringbootApplication 这个注解是Springboot最核心的注解,用在Springboot的主类上,标识这是一个Springboot应用,用来开启 ...