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. docker基本操作 备忘

    docker 基本操作 通过镜像运行容器 - docker run -d -it -p 5555:5555 镜像名 启动容器,并将进入容器中的bash命令行 进入容器 - docker attach ...

  2. For循环用法-打印乘法表

      for循环可以遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次).for循环的结构如下 具体例子打印乘法表: #打印乘法表: for i in range(1, ...

  3. Constant width to height ratio

    <div class="constant-width-to-height-ratio"></div> .constant-width-to-height-r ...

  4. 宏任务&微处理

    事件循环 JavaScript 语言的一大特点就是单线程,同一个时间只能做一件事.为了协调事件.用户交互.脚本.UI 渲染和网络处理等行为,防止主线程的不阻塞,Event Loop 的方案应用而生. ...

  5. find和filter有什么区别

    JavaScript 在 ES6 上有很多数组方法,每种方法都有独特的用途和好处. 在开发应用程序时,大多使用数组方法来获取特定的值列表并获取单个或多个匹配项. 在列出这两种方法的区别之前,我们先来一 ...

  6. Zookeeper 从入门到精通

    更多内容,前往IT-BLOG 一.Zookeeper概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目.Zookeeper从设计模式角度来理解:是一个基于观察者模 ...

  7. 一个基于GPT模型实现的Git Commit信息自动生成工具

    每次提交代码的时候,你是否有为如何写Commit Message而迟迟按不下提交的时刻呢?然后,死磨硬泡写了一些并提交后,又被review的小伙伴吐槽了呢?相信很多小伙伴有过这样的经历吧? 趁着最近C ...

  8. vulnhub靶场之HACKSUDO: 2 (HACKDUDO)

    准备: 攻击机:虚拟机kali.本机win10. 靶机:hacksudo: 2 (HackDudo),下载地址:https://download.vulnhub.com/hacksudo/hackdu ...

  9. 设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相关类

    现要对下面的配置文件进行解析,并自定义Spring框架的IOC对涉及到的对象进行管理. <?xml version="1.0" encoding="UTF-8&qu ...

  10. JSF预热功能在企业前台研发部的实践与探索

    作者:京东零售 李孟东 00 导读 企业前台研发部包含了企业业务大部分的对外前台系统,其中京东VOP平台(开放平台)适合于自建内网采购商城平台的企业客户. 京东为这类客户专门开发API接口,对接到客户 ...