2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格,
他可以从北边的任何一个格子出发,到达南边的任何一个格子,
但每一步只能走到东南、正南、西南方向的三个格子之一,
而且不能跨出红薯地,他可以获得经过的格子上的所有红薯,请问他可以获得最多的红薯个数。
来自小红书,小红书第一题。

答案2022-06-10:

动态规划。dp是两行格子。dp[0]是加arr[i][j]之前的最大值数组。dp[1]是加arr[i][j]之后最大值数组。
dp[1][j]=arr[i][j]+max(dp[0][j-1],dp[0][j],dp[[0][j+1])。未来不确定,但是过去是确定的。dp[0]代表过去,dp[1]根据过去的三条方向选择最优方向即可。
时间复杂度:O(MN)。
空间复杂度:O(N)。占用两行格子。

代码用rust编写。代码如下:

fn main() {let mut map: Vec<Vec<i32>> = vec![vec![3, 5, 6, 2, 4],vec![7, 8, 9, 1, 1],vec![1, 2, 3, 4, 5],];let ans = max_score(&mut map);println!("ans = {}", ans);let mut map: Vec<Vec<i32>> = vec![vec![3, 5, 6, 2, 4],vec![7, 8, 9, 1, 1],vec![1, 2, 3, 4, 5],];let ans = max_score2(&mut map);println!("ans = {}", ans);let mut map: Vec<Vec<i32>> = vec![vec![3, 5, 6, 2, 4],vec![7, 8, 9, 1, 1],vec![1, 2, 3, 4, 5],];let ans = max_score3(&mut map);println!("ans = {}", ans);
}fn max_score(map: &mut Vec<Vec<i32>>) -> i32 {let mut ans = 0;for col in 0..map[0].len() as i32 {ans = get_max(ans, process(map, 0, col));}return ans;
}fn process(map: &mut Vec<Vec<i32>>, row: i32, col: i32) -> i32 {if col < 0 || col == map[0].len() as i32 {return -1;}if row == map.len() as i32 - 1 {return map[row as usize][col as usize];}let cur = map[row as usize][col as usize];let next1 = process(map, row + 1, col - 1);let next2 = process(map, row + 1, col);let next3 = process(map, row + 1, col + 1);return cur + get_max(get_max(next1, next2), next3);
}fn max_score2(map: &mut Vec<Vec<i32>>) -> i32 {let mut ans = 0;let n = map.len() as i32;let m = map[0].len() as i32;let mut dp: Vec<Vec<i32>> = vec![];for i in 0..n {dp.push(vec![]);for _ in 0..m {dp[i as usize].push(-2);}}for col in 0..map[0].len() as i32 {ans = get_max(ans, process2(map, 0, col, &mut dp));}return ans;
}fn process2(map: &mut Vec<Vec<i32>>, row: i32, col: i32, dp: &mut Vec<Vec<i32>>) -> i32 {if col < 0 || col == map[0].len() as i32 {return -1;}if dp[row as usize][col as usize] != -2 {return dp[row as usize][col as usize];}// 继续算!let mut ans = 0;if row == map.len() as i32 - 1 {ans = map[row as usize][col as usize];} else {let cur = map[row as usize][col as usize];let next1 = process2(map, row + 1, col - 1, dp);let next2 = process2(map, row + 1, col, dp);let next3 = process2(map, row + 1, col + 1, dp);ans = cur + get_max(get_max(next1, next2), next3);}dp[row as usize][col as usize] = ans;return ans;
}// 最优方法
fn max_score3(map: &mut Vec<Vec<i32>>) -> i32 {let n = map.len() as i32;let m = map[0].len() as i32;let mut dp: Vec<Vec<i32>> = vec![];for _ in 0..2 {dp.push(map[0].clone());}for i in 1..n {for j in 0..m as i32 {dp[1][j as usize] = get_max(get_max(dp[0][j as usize],if j - 1 >= 0 {dp[0][(j - 1) as usize]} else {0},),if j + 1 < m {dp[0][(j + 1) as usize]} else {0},) + map[i as usize][j as usize];}dp[0] = dp[1].clone();}let mut ans = dp[0][0];for i in 1..m {ans = get_max(ans, dp[0][i as usize]);}return ans;
}fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {if a > b {a} else {b}
}

执行结果如下:


左神java代码

2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的相关推荐

  1. 人工智能 | ShowMeAI资讯日报 #2022.06.10

    ShowMeAI日报系列全新升级!覆盖AI人工智能 工具&框架 | 项目&代码 | 博文&分享 | 数据&资源 | 研究&论文 等方向.点击查看 历史文章列表, ...

  2. Mac M1Pro芯片,新手从安装jdk到第一个Java程序详细指南(2022年10月)

    因为是一个新手,什么都不懂的,遇到一个命令行都要去查去理解,所以常见坑我都会说明,针对小白非常友好.()里的是扩展知识,可以不看 下文不包含下载常见的代码编辑器,可以做完二配置JDK环境,就去参考别的 ...

  3. 每天一道LeetCode-----找到有多少条连续路径的和为给定值,路径不需要从根节点出发到达叶子节点

    Path Sum III 原题链接Path Sum III 给定一个二叉树,计算二叉树中有多少条路径的元素和等于某个值,路径只需要连续即可,不要求必须从根节点出发到达叶子节点 如果只是简单的递归,那么 ...

  4. 2022年10月7日(星期五)骑行反环草海湿地公园

    2022年10月7日 (星期五):骑行反环草海湿地公园,早8:30到9:00, 大观建材城门囗集合9:30准时出发 [因迟到者,骑行速度快者,可自行追赶偶遇.] 偶遇地点: 大观建材城门囗集合,家住东 ...

  5. 2022年10月中国数据库排行榜:达梦冲刺IPO热度不减,PolarDB立足创新夺锦才

    秋风萧瑟,洪波涌起. 2022年10月的 墨天轮中国数据库流行度排行榜 火热出炉,本月共有245个数据库参与排名,相比上月新增七个数据库,本月排行榜前十名变动较大:达梦反超openGauss重摘探花: ...

  6. 2022年10月30日马丁·加德纳聚会线上活动重磅来袭!

    早点关注我,精彩不错过! 随着秋风的日益清冷,一年一度的马丁·加德纳聚会悄然而至,这红叶纷飞的十月,恰是数学爱好者们期盼的欢聚时刻. 聚会时间:2022年10月30号全天 形式:腾讯线上会议. 地点: ...

  7. 人工智能 | ShowMeAI资讯日报 #2022.06.24

    ShowMeAI日报系列全新升级!覆盖AI人工智能 工具&框架 | 项目&代码 | 博文&分享 | 数据&资源 | 研究&论文 等方向.点击查看 历史文章列表, ...

  8. 【对话生成】常见对话生成数据集整理,含下载链接(更新至2022.06.04)

    [对话生成]常见对话生成数据集整理,含下载链接(持续更新) 前言 用于对话理解的对话数据集 IEMOCAP SEMAINE Mastodon MELD EMOTyDA MEmoR M3^33ED CP ...

  9. 李迟2022年10月工作生活总结

    本文为 2022 年 10 月工作生活总结. 研发编码 Go 判断interface{}是否为空 判断interface{}类型是否为空,不能直接使用==nil来判断(用之无效),需先用reflect ...

  10. 数学建模学习视频及资料集(2022.08.10)

    2021高中数学建模(应用)能力展示活动细则详解(上) 2021高中数学建模(应用)能力展示活动细则详解(上)_哔哩哔哩_bilibili 2021高中数学建模(应用)能力展示活动细则详解(下) 20 ...

最新文章

  1. ubuntu再次体验之【美化】--修改主题、字体、字体大小
  2. Oracle数据库之创建和管理表
  3. 异步发送,那消息可靠性怎么保证?
  4. sonarqube没有html插件,SonarQube Github插件没有写拉问题的问题
  5. TableLayoutPanel闪烁问题解决
  6. 三星雪上加霜?高通骁龙875或将回归台积电
  7. KuaiRec | 快手发布首个稠密度高达99%的推荐数据集, 可用于多种推荐系统方向研究...
  8. 开启 ASA 5505 snmp协议
  9. Kubernetes的调度机制
  10. java运行库下载_Java运行库下载-jdk1.7 64位下载1.8.0.20 官方最新版-东坡下载
  11. Illumination Normalization Based on Weber’s Law With Application to Face Recognition
  12. vs2008中文版 下载
  13. 微信小程序设置文字样式white-space失效
  14. 【100%通过率】华为OD机试真题 Python 实现【完美走位】【2022.11 Q4新题】
  15. 微信小程序多音频场景处理 - 背景音频
  16. 石墨笔记,熊掌记和Effie哪个更适合up主?
  17. 字符串中空格相关操作
  18. pstack无法查看进程堆栈“Could not attach to target”问题
  19. python字符宽度_使用vars或\uyu dict的Python固定宽度字符串格式__
  20. Mac上如何安装Mysql5以及可视化工具navicat

热门文章

  1. C# AutoCAD图纸插入块(另一个dwg文件)
  2. 用php做一个网站,教你如何用PHP开发一个完整网站
  3. sqlserver联合查询注入
  4. html怎么导航栏中加边框,html – 使用CSS在导航栏中显示边框三角形
  5. 计算机蓝屏重启,电脑蓝屏怎么解决?电脑蓝屏自动重启解决方法
  6. Facebook努力回归中国,微博会被人们放弃吗?
  7. 基于 EMD 和小波包的降噪方法研究
  8. 【毕业设计/课程设计】企业员工绩效考评APP的设计与实现
  9. 计算机挂个硬盘显示格式化怎么解决,硬盘提示格式化怎么办?硬盘数据怎么恢复?...
  10. 硕士论文查重原理与快速通过的七大方法