当前位置:网站首页>2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的
2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的
2022-06-11 03:44:00 【福大大架构师每日一题】
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
}
}
执行结果如下:

边栏推荐
- 高考结束,可以干什么事情,专业应该如何选择?-- 来自一个在校大学生的肺腑之言
- ImportError: DLL load failed while importing _ Sqlite3: the specified module could not be found
- 关于重复发包的防护与绕过
- [elt.zip] openharmony paper Club - multi tier storage hierarchical data compression
- Go failing - expected ‘package‘, found ‘EOF‘
- Path count 2 (DP + number of combinations)
- JMeter piezometric interface programming North
- Market prospect analysis and Research Report of integrated scanner in 2022
- Typera+picgo+ common configurations of Tencent cloud cos
- Exam item management system based on SSM
猜你喜欢

Docker swarm installs redis cluster (bitnami/redis cluster:latest)

Detailed explanation of network time synchronization (NTP network timing) of video monitoring system

A Security Analysis Of Browser Extensions

手工测试转不了自动化测试,缺的是什么?

Large factory outsourcing or self research company? How to choose a job for a tester?

Manual testing cannot be changed to automated testing. What is missing?

Simple image browsing with fragment

Student teacher examination management system based on SSM framework

Thinkphp3.2.3 deserialization using chain analysis
![From function test to advanced automation test, I stayed up 7 days to sort out this 3000 word super complete learning guide [with network disk resources]](/img/bd/478558d50aa14320c70d3f8a7b76a5.png)
From function test to advanced automation test, I stayed up 7 days to sort out this 3000 word super complete learning guide [with network disk resources]
随机推荐
OpenGL Chapter 10 illuminant
Record a VMware problem
开源项目 英雄联盟 之WPF
Lexical analyzer for compiling principle notes
Maui migration guide
[network] socket programming
Docker swarm installs redis cluster (bitnami/redis cluster:latest)
基于SSM的大学生社团管理系统
Quartz:老而弥坚的开源任务调度框架,用起来够丝滑
clickjacking漏洞的挖掘与利用
A - Eddy‘s AC难题(C语言)
Quel genre de personne est heureuse?
SSLStrip 终极版 —— location 劫持
BP神经网络C语言实现总结
MAUI 遷移指南
How PTP helps several major operators meet 5g timing requirements
NTP time server (GPS Beidou satellite synchronous clock) application boiler monitoring system
Market prospect analysis and Research Report of programmable digital temperature regulator in 2022
雷达辐射源调制信号仿真
Build local source 2.0 for Galaxy Kirin server version