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. 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之后不可以再离开. ...

  2. 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 ...

  3. 2017.10.5北京清北综合强化班DAY5

    拼不出的数lost.in/.out/.cpp[问题描述]3 个元素的集合{5, 1,2} 的所有子集的和分别是0,1, 2, 3, 5, 6, 7, 8.发现最小的不能由该集合子集拼出的数字是4.现在 ...

  4. nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token

    nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token 注意: proxy_pass http://192.168.40.54:22 ...

  5. 从一个 issue 出发,带你玩图数据库 NebulaGraph 内核开发

    如何 build NebulaGraph?如何为 NebulaGraph 内核做贡献?即便是新手也能快速上手,从本文作为切入点就够了. NebulaGraph 的架构简介 为了方便对 NebulaGr ...

  6. 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。

    这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关 ...

  7. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  8. hadoop 集群 加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令

    加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令 方式1:静态添加datanode,停止namenode方式 1.停止namenode 2.修改slaves文件,并更新到各个节点3.启动na ...

  9. javascript 一个关于时间排序的算法(一个页面多个倒计时排序)

    上周要做一个活动页面 秒杀列表页 需要一个时间的算法排序 自己琢磨了半天想了各种算法也没搞出来,后来问了下一个后台的php同学 他写了个算法给我看了下 ,刚开始看的时候觉得这就是个纯算法,不能转化成页 ...

  10. IP概念盛行的背后:资本在狂欢,电影想哭泣 IP,英文“Intellectual Property”的缩写,直译为“知识产权”。它的存在方式很多元,可以是一个故事,也可以是某一个形象,运营成功的IP可以在漫画、小说、电影、玩具、手游等不同的媒介形式中转换。

    IP概念盛行的背后:资本在狂欢,电影想哭泣 IP容易拉投资.谈合作,甚至还能简化宣发途径,越来越多的人涌入了电影这个产业,争抢IP成为他们进入行业的最快捷的方法.IP盛行暴露出的另一个问题是国产电影原 ...

随机推荐

  1. decay_rate, decay_steps ,batchsize,iteration,epoch

    (96条消息) decay_rate, decay_steps ,batchsize,iteration,epoch_hellocsz的博客-CSDN博客_decay_steps (1)batchsi ...

  2. 去除Bigdecimal末尾的.00

    String total = new BigDecimal("100.00").stripTrailingZeros().toPlainString();

  3. 实验2 数组、指针与C++标准库

    实验任务5: Info.hpp #ifndef INFO_HPP #define INFO_HPP #include<iostream> #include<iomanip> # ...

  4. ElasticSearch在linux环境安装和启动

    1.下载 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-0 2.安装启动 2.1 错误1 Java HotSp ...

  5. centos7下安装Node.js MongoDB Nginx

     一.Node.js 方法1(笔者采用).如果对Node.js环境有比较高的要求,建议选择源码安装的方式进行安装,通过wget命令下载Node.js官网上的tar.gz文件包到centos服务器上,进 ...

  6. SpringBoot之基于idea搭建ssm(maven)

    此次目标为搭建一个简单的基于springboot的ssm(spring + springmvc + mybatis)的maven项目,使用的数据库为mysql. 最终项目目录结构 创建过程 1.项目创 ...

  7. linux java 环境搭建

    java -version 是否安装 yum -y remove java-1.7.0-openjdk* yum -y install java-1.7.0-openjdk* vim /etc/pro ...

  8. Android笔记--视图显示

    视图显示 视图的宽高设置 方式一:在.xml文件中设置视图的宽和高 通过调用android:layout_width设置视图的宽 通过调用android:layout_height设置视图的高 宽和高 ...

  9. Netty 心跳检测与重连机制

    更多内容,前往个人博客 所谓心跳,即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包,通知对方自己还在线,以确保 TCP 连接的有效性.心跳包还有另一个作用,经常被忽略,即:一个连 ...

  10. boss直聘自动化爬取招聘信息

    自己百度下载一个scrpy(爬虫框架) 不知博客园咋传文件 百度网盘 永久访问 链接:https://pan.baidu.com/s/1_-5lnnTj_qs9d_jtWkFgcA 提取码:x3ur