2022-04-14:小美有一个长度为n的数组, 为了使得这个数组的和尽量大,她向会魔法的小团进行求助。 小团可以选择数组中至多两个不相交的子数组, 并将区间里的数全都变为原来的10倍。 小团想知道他
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
}
}
执行结果如下:

2022-04-14:小美有一个长度为n的数组, 为了使得这个数组的和尽量大,她向会魔法的小团进行求助。 小团可以选择数组中至多两个不相交的子数组, 并将区间里的数全都变为原来的10倍。 小团想知道他的更多相关文章
- 【算法30】从数组中选择k组长度为m的子数组,要求其和最小
原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...
- LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Ea ...
- LeetCode:长度最小的子数组【209】
LeetCode:长度最小的子数组[209] 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 ...
- 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 ...
- Java与JavaScript中判断两字符串是否相等的区别
JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...
- JavaScript中的两种全局对象
这里总结的东西特别适合先学习c/c++, Java这类标准语言再学JS的童鞋们看,因为JS在程序执行之前就会初始化一个全局对象,这个全局对象到底是什么是跟JS程序运行环境有关的. 根据JavaScri ...
- validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符
//校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...
- 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] 之外的 ...
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...
- 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...
随机推荐
- Pandas嵌套词典解析或取值
# tribe列只保留name 值 df['tribe']=df['tribe'].apply(lambda x:eval(x)['name']) # tribe 列全部项目展开 df=df['con ...
- vlan划分和设置
今天用ensp模拟一个交换机vlan的划分和设置 先上拓扑图: 目标要实现每台电脑都能相互ping通并且都能ping通1.1.1.1/30 简单分析一下,先看交换机sw3,sw3直接和路由器相连,要实 ...
- 谈谈Selenium中的日志
谈谈Selenium中的日志 来源于一位同学,"老师为啥firefox执行后会有日志文件,chrome没有呢?" 比对 你打开chrome浏览器 from selenium imp ...
- python爬虫基础教程
爬虫介绍 爬虫就是程序,是从互联网中,各个网站上爬取数据(能浏览到的网页才可以爬),做数据清洗,入库 爬虫本质: 模拟http请求,获取数据,入库 网站/app > 抓包 我们日常使用的baid ...
- 4.错误代码C1083
有的时候在VS中遇到的error C1083: 无法打开**: " * .*": No such file or directory的错误,这里总结了我遇到过的情况: 错误 C10 ...
- K8S安全学习
k8s安全学习 一.云 云的定义看似模糊,但本质上,它是一个用于描述全球服务器网络的术语,每个服务器都有一个独特的功能.云不是一个物理实体,而是一个庞大的全球远程服务器网络,它们连接在一起,旨在作为单 ...
- Java面试——Java基础
更多内容,移步IT-BLOG 一.JAVA中的几种基本数据类型 Java语言中一共提供了8种原始的数据类型(byte,short,int,long,float,double,char,boolean) ...
- 磁盘IO 基本常识
计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的 CPU主频早已超过3GHz,内存也进入了普及DDR4的时代.然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时SS ...
- ChatGPT能给IOT行业带来哪些改变
引言 随着移动互联网.传感器的发展,移动互联的潮流逐渐转移到物联网行业,每个设备成为了物联网连接的终端. 与传统的设备相比,智能设备最突出的特点就是智能化.目前,在市场上的智能设备通过智能程序设定或者 ...
- wx相关
1.vue图片预览放大 https://www.jianshu.com/p/e3350aa1b0d0 2.js图片文件格式的转换 https://www.jianshu.com/p/ea757f90b ...