2022-04-14:小美有一个长度为n的数组,
为了使得这个数组的和尽量大,她向会魔法的小团进行求助。
小团可以选择数组中至多两个不相交的子数组,
并将区间里的数全都变为原来的10倍。
小团想知道他的魔法最多可以帮助小美将数组的和变大到多少?
来自美团。

答案2022-04-14:

动态规划。
时间复杂度:O(N)。
空间复杂度:O(N)。

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

#![feature(core_intrinsics)]
fn print_type_of<T>(_: T) {
println!("{}", unsafe { std::intrinsics::type_name::<T>() });
} fn main(){
let arr: Vec<i32> = vec![3, -4, 5, 1, -3];
let ret:i32 = max_sum2(arr);
println!("{}",ret);
print_type_of(ret);
} fn max_sum2(arr: Vec<i32>) ->i32 {
let n = arr.len();
if n == 0 {
return 0;
}
if n == 1 {
return get_max(arr[0], arr[0]*10);
}
// dp[i]
// 1) arr[0...i]原始累加和
// 2) dp[i-1] + arr[i]
// 3) magic[i] // : arr[0..i]范围上,可以没有10倍区域、或者有10倍区域但是最多有一个的情况下,
// 最大累加和是多少?
// 可能性1:就是没有10倍区域,那就是arr[0..i]的累加和, 这个好弄!
//
// 可能性2:有一个10倍区域
// a : arr[i]不在10倍区域里,但是之前可能有,那么就是dp[i-1] + arr[i]
//
// b : arr[i]在10倍区域里
// 甲:arr[0..i-1]没有10倍区域,arr[i]自己10倍,arr[0..i-1] + 10 * arr[i]
// 乙:arr[0..i-1]中i-1位置在10倍区域里,arr[i]也在10倍区域里
// magic[i] : magic[i] ..i i
// 对于乙,要求知道magic[j]的信息
// magic[j]:arr[0..j]范围上,j一定要在10倍区域里,并且只有一个10倍区域的情况下,最大累加和
// 可能性1:只有arr[j]是10倍,arr[0..j-1]没有10倍
// 可能性2:magic[j-1] + 10 * arr[j]
let mut sum :i32 = arr[(n-1) as usize];
let mut magic:i32 = sum * 10;
let mut right:Vec<i32> = Vec::new();
for i in 0..n {
right.push(0);
} right[n-1] = get_max(sum, sum*10); let mut i:isize=n as isize -2 as isize;
while i >= 0 {
magic = 10*arr[i as usize] + get_max(sum, magic);
sum = sum + arr[i as usize];
right[i as usize] = get_max(get_max(sum, right[i as usize + 1] + arr[i as usize]), magic);
i = i - 1;
}
let mut ans:i32 = right[0];
sum = arr[0];
magic = sum * 10;
let mut dp:i32 = get_max(sum, sum * 10);
ans = get_max(ans, dp + right[1]);
i=1;
while i < n as isize-1{
magic = 10 * arr[i as usize] + get_max(sum, magic);
sum = sum + arr[i as usize];
dp = get_max(get_max(sum, dp+arr[i as usize]), magic);
ans = get_max(ans, dp + right[i as usize + 1]);
i = i + 1;
}
return ans;
} fn get_max(a:i32, b :i32) ->i32 {
if a > b {a} else {b}
}

执行结果如下:

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

package main

import "fmt"

func main() {
arr := []int{3, -4, 5, 1, -3}
ret := maxSum2(arr)
fmt.Println(ret)
} func maxSum2(arr []int) int {
n := len(arr)
if n == 0 {
return 0
}
if n == 1 {
return getMax(arr[0], arr[0]*10)
}
// dp[i]
// 1) arr[0...i]原始累加和
// 2) dp[i-1] + arr[i]
// 3) magic[i] // : arr[0..i]范围上,可以没有10倍区域、或者有10倍区域但是最多有一个的情况下,
// 最大累加和是多少?
// 可能性1:就是没有10倍区域,那就是arr[0..i]的累加和, 这个好弄!
//
// 可能性2:有一个10倍区域
// a : arr[i]不在10倍区域里,但是之前可能有,那么就是dp[i-1] + arr[i]
//
// b : arr[i]在10倍区域里
// 甲:arr[0..i-1]没有10倍区域,arr[i]自己10倍,arr[0..i-1] + 10 * arr[i]
// 乙:arr[0..i-1]中i-1位置在10倍区域里,arr[i]也在10倍区域里
// magic[i] : magic[i] ..i i
// 对于乙,要求知道magic[j]的信息
// magic[j]:arr[0..j]范围上,j一定要在10倍区域里,并且只有一个10倍区域的情况下,最大累加和
// 可能性1:只有arr[j]是10倍,arr[0..j-1]没有10倍
// 可能性2:magic[j-1] + 10 * arr[j]
sum := arr[n-1]
magic := sum * 10
right := make([]int, n)
right[n-1] = getMax(sum, sum*10)
for i := n - 2; i >= 0; i-- {
magic = 10*arr[i] + getMax(sum, magic)
sum += arr[i]
right[i] = getMax(getMax(sum, right[i+1]+arr[i]), magic)
}
ans := right[0]
sum = arr[0]
magic = sum * 10
dp := getMax(sum, sum*10)
ans = getMax(ans, dp+right[1])
for i := 1; i < n-1; i++ {
magic = 10*arr[i] + getMax(sum, magic)
sum += arr[i]
dp = getMax(getMax(sum, dp+arr[i]), magic)
ans = getMax(ans, dp+right[i+1])
}
return ans
} func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}

执行结果如下:


左神java代码

2022-04-14:小美有一个长度为n的数组, 为了使得这个数组的和尽量大,她向会魔法的小团进行求助。 小团可以选择数组中至多两个不相交的子数组, 并将区间里的数全都变为原来的10倍。 小团想知道他的更多相关文章

  1. 【算法30】从数组中选择k组长度为m的子数组,要求其和最小

    原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...

  2. LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Ea ...

  3. LeetCode:长度最小的子数组【209】

    LeetCode:长度最小的子数组[209] 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 ...

  4. Codeforces Round #384 (Div. 2) A B C D dfs序+求两个不相交区间 最大权值和

    A. Vladik and flights time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  5. Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...

  6. JavaScript中的两种全局对象

    这里总结的东西特别适合先学习c/c++, Java这类标准语言再学JS的童鞋们看,因为JS在程序执行之前就会初始化一个全局对象,这个全局对象到底是什么是跟JS程序运行环境有关的. 根据JavaScri ...

  7. validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符

    //校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...

  8. java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}

    /** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...

  9. 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

    题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...

  10. 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...

随机推荐

  1. 关于使用antd-proTable,报错 ResizeObserver loop limit exceeded

    错误如上,原因有几种情况 一:columns中,属性又ellipsis属性,但是没有设置width,导致table不知道如何计算在什么时候,开始对内容进行加省略号,出现了计算错误 如  const c ...

  2. getopts解析shell脚本命令行参数

    getopts命令格式 getopts optstring name [arg] optstring为所有可匹配选项组成的字符串,每个字母代表一个选项.如果字母后有冒号:,表明该选项需要选择参数.比如 ...

  3. 文件的上传&预览&下载学习(五)

    1.背景 一个知识库,要求文件对不同的角色有不同的实现,比如某些角色只能在线预览,某些可以下载.在线观看. 2.分析 知识库其实也可以看做商品表,商品有商品图片(商品表与文件信息表做关联,因为商品有多 ...

  4. springboot邮箱验证功能部署到服务器后报25 timeout的解决方式

    可以写在application.yml中或者 写在配置类中, 如下; 原理就是更改端口,并且配置ssl的相关配置 package com.wfszmg.config; import org.sprin ...

  5. 面试突击:MVCC 和间隙锁有什么区别?

    MVCC 和间隙锁是两种完全不同的机制,但它们的目的都是相同的,都是用来保证数据库并发访问的,我们先来看二者的定义. MVCC 定义 MVCC 是多版本并发控制(Multi-Version Concu ...

  6. es6中clss做了些什么 怎么继承

    我的理解是clss实际是一种语法糖 凡是es6中clss能做的 我们通过es5也同样可以完成传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性 ...

  7. react中自定义函数、生命周期钩子函数、修改状态、组件、组件传值

    1.回顾 2.自定义函数 事件的首字母大小 onclick ==> onClick onchange ==> onChange 普通的点击事件 ---- 调用事件不加(),加了立即执行 i ...

  8. docker方式实现redis数据持久化离线安装

    保存镜像 root@hello:~# docker pull redis:latest latest: Pulling from library/redis a2abf6c4d29d: Already ...

  9. 【入门排坑】Windows之间使用OpenSSH的ssh免密登录,排坑

    安装 安装OpenSSH 需要安装OpenSSH客户端和服务器,win10自带客户端,我们安装服务器即可. 设置 -- 应用 -- 可选功能 -- 添加 -- 添加 OpenSSH 服务器 配置 公钥 ...

  10. pandas之分类操作

    通常情况下,数据集中会存在许多同一类别的信息,比如相同国家.相同行政编码.相同性别等,当这些相同类别的数据多次出现时,就会给数据处理增添许多麻烦,导致数据集变得臃肿,不能直观.清晰地展示数据. 针对上 ...