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 ...
随机推荐
- HTML-CSS常用代码
注释标签:对代码进行说明<!-- 单行注释,也可以对多行文字进行注释 -->常用格式标签<b>加粗</b> <i>斜体</i> <u& ...
- .net core 使用 Nlog 集成 exceptionless 配置文件
nlog.config文件 安装nuget包: NLog.Web.AspNetCore Exceptionless.NLog 配置文件开始 <?xml version="1.0&quo ...
- UI资源,可在几分钟内创建精美的设计
UI资源,可在几分钟内创建精美的设计 组件:https://headlessui.com 图标:https://icons8.com 插画:https://undraw.co/illustration ...
- 给jui(dwz)的navTab换一套漂亮的图标
上次讲了给jui(dwz)的菜单树换一套漂亮的图标,这次讲一下在点击菜单后,怎么把设置的漂亮图标带到navTab上去. 官方的navTab是这样显示的,除了默认的我的主页外,tab页上只有标题没有图标 ...
- linux 镜像备份
linux 镜像备份 使用linux虚拟机的方法 优点 镜像大小比较小 缺点 速度可能比较慢 方法 1.打开虚拟机 我用的ubuntu,读卡器连接电脑虚拟机,ubuntu一般会自动挂载 df -h # ...
- 矩形面积k次交 UVA - 11983
算是模板题,会了面积交这个应该就会了,正常面积交分为覆盖1次以上,两次以上,这个就分为覆盖1到k次以上就行了. 这个题有点边界问题:是让你求覆盖的点,所以你可以假设一个1*1的正方向表示它的左下角被覆 ...
- Mysql 备份方案
一.为什么要备份 [1]容灾恢复:硬件故障.不经意的 Bug 导致数据损坏,或者服务器及其数据由于某些原因不可获取或无法使用等(例如:机房大楼烧毁,恶意的黑客攻击或 Mysql 的 Bug 等).[2 ...
- PHP 微信三方平台代公众号发起网页授权 获取用户信息
1.获取code 2.通过授权回调地址的code获取用户access_token和open_id 3.通过access_token和open_id 获取用户基本信息 class wx_user { p ...
- app稳定性测试-iOS篇
稳定性测试:测试应用程序在长时间运行过程中是否存在内存泄漏.崩溃等问题,以确保应用程序具有较高的稳定性和可靠性. 对于安卓端,官方提供了很好的稳定性测试工具:monkey. 相比较而言,iOS则没有, ...
- w32模块模拟鼠标键盘操作
win32api.keybd_event 该函数原型:keybd_event(bVk, bScan, dwFlags, dwExtraInfo) 第一个参数:虚拟键码(键盘键码对照表见附录): 第二个 ...