前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-05-06:给你一个整数数组 arr,请你将该数组分隔为长度最多为 k 的一些(连续)子数组。

2022-05-06:给你一个整数数组 arr,请你将该数组分隔为长度最多为 k 的一些(连续)子数组。

作者头像
福大大架构师每日一题
发布2022-06-04 10:46:37
2430
发布2022-06-04 10:46:37
举报
文章被收录于专栏:福大大架构师每日一题

2022-05-06:给你一个整数数组 arr,请你将该数组分隔为长度最多为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。

返回将数组分隔变换后能够得到的元素最大和。

注意,原数组和分隔后的数组对应顺序应当一致,也就是说,你只能选择分隔数组的位置而不能调整数组中的顺序。

输入:arr = [1,15,7,9,2,5,10], k = 3。

输出:84。

解释:

因为 k=3 可以分隔成 [1,15,7] [9] [2,5,10],结果为 [15,15,15,9,10,10,10],和为 84,是该数组所有分隔变换后元素总和最大的。

若是分隔成 [1] [15,7,9] [2,5,10],结果就是 [1, 15, 15, 15, 10, 10, 10] 但这种分隔方式的元素总和(76)小于上一种。

力扣1043. 分隔数组以得到最大和。

答案2022-05-06:

从左往右的尝试模型。0到i记录dp[i]。

假设k=3,分如下三种情况:

1.i单个一组dp[i]=[i]+dp[i-1]。

2.i和i-1一组。

3.i和i-1和i-2一组。

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

代码语言:javascript
复制
fn main() {
    let mut arr: Vec<isize> = vec![1, 15, 7, 9, 2, 5, 10];
    let k: isize = 3;
    let answer = max_sum_after_partitioning2(&mut arr, k);
    println!("answer = {}", answer);
}

fn max_sum_after_partitioning2(arr: &mut Vec<isize>, k: isize) -> isize {
    if arr.len() == 0 {
        return 0;
    }
    let n = arr.len() as isize;
    let mut dp: Vec<isize> = vec![];
    for _i in 0..n {
        dp.push(0);
    }
    dp[0] = arr[0];
    for i in 1..n {
        dp[i as usize] = arr[i as usize] + dp[(i - 1) as usize];
        let mut max = arr[i as usize];
        let mut j = i - 1;

        while j >= 0 && (i - j + 1) <= k {
            max = get_max(max, arr[j as usize]);
            dp[i as usize] = get_max(
                dp[i as usize],
                max * (i - j + 1) + if j - 1 >= 0 { dp[(j - 1) as usize] } else { 0 },
            );
            j -= 1;
        }
    }
    return dp[(n - 1) as usize];
}

fn get_max(a: isize, b: isize) -> isize {
    if a > b {
        a
    } else {
        b
    }
}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_02_4_week/Code03_PartitionArrayForMaximumSum.java)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档