2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的
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
}
}
执行结果如下:

2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的的更多相关文章
- 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。
/** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...
- phoenix连接hbase数据库,创建二级索引报错:Error: org.apache.phoenix.exception.PhoenixIOException: Failed after attempts=36, exceptions: Tue Mar 06 10:32:02 CST 2018, null, java.net.SocketTimeoutException: callTimeou
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- 2017.10.5北京清北综合强化班DAY5
拼不出的数lost.in/.out/.cpp[问题描述]3 个元素的集合{5, 1,2} 的所有子集的和分别是0,1, 2, 3, 5, 6, 7, 8.发现最小的不能由该集合子集拼出的数字是4.现在 ...
- nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token
nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token 注意: proxy_pass http://192.168.40.54:22 ...
- 从一个 issue 出发,带你玩图数据库 NebulaGraph 内核开发
如何 build NebulaGraph?如何为 NebulaGraph 内核做贡献?即便是新手也能快速上手,从本文作为切入点就够了. NebulaGraph 的架构简介 为了方便对 NebulaGr ...
- 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。
这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- hadoop 集群 加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令
加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令 方式1:静态添加datanode,停止namenode方式 1.停止namenode 2.修改slaves文件,并更新到各个节点3.启动na ...
- javascript 一个关于时间排序的算法(一个页面多个倒计时排序)
上周要做一个活动页面 秒杀列表页 需要一个时间的算法排序 自己琢磨了半天想了各种算法也没搞出来,后来问了下一个后台的php同学 他写了个算法给我看了下 ,刚开始看的时候觉得这就是个纯算法,不能转化成页 ...
- IP概念盛行的背后:资本在狂欢,电影想哭泣 IP,英文“Intellectual Property”的缩写,直译为“知识产权”。它的存在方式很多元,可以是一个故事,也可以是某一个形象,运营成功的IP可以在漫画、小说、电影、玩具、手游等不同的媒介形式中转换。
IP概念盛行的背后:资本在狂欢,电影想哭泣 IP容易拉投资.谈合作,甚至还能简化宣发途径,越来越多的人涌入了电影这个产业,争抢IP成为他们进入行业的最快捷的方法.IP盛行暴露出的另一个问题是国产电影原 ...
随机推荐
- lua的一些封装方法
获取点击屏幕坐标 1 function getTouchPosition() 2 local locationX, locationY 3 4 local listener = cc.EventLis ...
- WinUI(WASDK)使用ChatGPT和摄像头手势识别结合TTS让机器人更智能
前言 之前写过一篇基于ML.NET的手部关键点分类的博客,可以根据图片进行手部的提取分类,于是我就将手势分类和摄像头数据结合,集成到了我开发的电子脑壳软件里. 电子脑壳是一个为稚晖君开源的桌面机器人E ...
- 音视频编解码 -- 编码参数 CRF
之前多多少少接触过一些编解码参数,CRF 参数也用过,但是最近在和朋友们聊天时,说到使用 FFMPEG 过程中碰到 CRF 参数,以及具体作用流程,这个之前一直没有跟踪过,也没有详细记录过,所以吊起了 ...
- Windows的压缩文件夹(zip/cab)
https://weibo.com/1114096665/DtHXgvnva #windows10# 硬要把zip.cab文件当文件夹,不爽怎么解决? 删除注册表 "HKEY_CLASSES ...
- Java中使用List的add方法后元素相同问题
在写JavaWeb时,我在后端通过JDBC读取了数据后逐个使用List.add()方法添加元素并通过request方法传给jsp页面解析,但是添加以后出现了在列表里有n个(假设添加了n个元素)最后一个 ...
- 线性规划与整数规划—R实现
线性规划的R语言实现 R语言在针对各类优化模型时都能快速方便的求解,对运输问题.生产计划问题.产销问题和旅行商问题等都有专门的R包来解决.线性规划与整数规划的区别主要在于对决策变量的取值约束有所不同. ...
- python线程之event事件
from threading import Thread, Event import time event = Event() def light(): print('红灯亮着,所有车都要等待') t ...
- EF Core 使用Azure App Service中的In-App MySQL服务
Azure App Service 提供了一个应用内的MySQL,可以供测试.开发使用. 前提条件是需要使用Windows的操作系统. 创建完App Server 之后,只需要在设置下开启 MySQL ...
- SSM整合的所有配置(配置类)
导入依赖坐标pom.xml <dependencies> <dependency> <groupId>junit</groupId> <artif ...
- mapper接口中常见的增删改查
前言 相信大家在使用mybatis写mapper接口的时候,最常用且简单的方法就是增删改查了.我也是刚开始做项目,在本篇文章中,我将根据自己在vhr微人力项目中的mapper接口方法为实例,记录一下接 ...