连续子序列最大最小值差额最大化

2023-11-13

本文为最近做过的一道编程笔试题,代码实现方式多种多样,此处本人提供的代码可以获得正确解,仅供大家参考。

一、题目描述

题目描述
Mike在一家律师事务所工作,他的老板Harvey分配给他N个新案件,每个案件都有自己的利益值。Harvey要求他将连续案件分组,让所有组的利益值总额最大化。一组的利益值由该组内案件个别利益值的最大与最小值之间的差额决定。Harvey知道这对Mike来说将是一项很轻松的任务,因此,他要求Mike记住一点,如果一组内只有单个案件,其利益值将视为零。
输入描述

  • 输入1: 整数N,代表案件数量
  • 输入2: 整数数组A,代表案件的利益值

输出描述

  • 返回所有组中的最大利益值。

示例

  • 输入
    5
    1 3 2 4 5
    
  • 输出
    5
    

说明:
有5个案件,我们按照以下顺序获得案件的最大利益值:

  • 组1: {1,3},最大利益值 = 2 (3-1)。
  • 组2: {2,4,5}, 最大利益值 = 3 (5-2)

利益值总额 = 2+3 = 5。因此,返回 5作为输出结果。

二、实现代码程序

解题思路:
根据Harvey的要求,Mike需要将N个新案件分组,使得每个组内案件个别利益值的最大与最小值之间的差额最大化。为了解决这个问题,可以使用动态规划的方法。

  • 我们可以定义一个数组dp,其中dp[i]表示前i个案件能够得到的最大利益值总额。对于每个案件i,我们需要找到它所属的组,使得该组内案件个别利益值的最大与最小值之间的差额最大化。
  • 对于第i个案件,我们可以选择将其与前面的某个案件j放在同一组内,或者将其作为单独的一组。如果将其与前面的案件j放在同一组内,那么该组的利益值总额为dp[j-1]加上该组内案件个别利益值的最大与最小值之间的差额。如果将其作为单独的一组,那么该组的利益值总额为0。
  • 因此,我们可以得到状态转移方程:
    dp[i] = max(dp[j-1] + max_val - min_val, dp[i-1])
    其中,max_val表示第j到第i个案件中的最大利益值,min_val表示第j到第i个案件中的最小利益值。
  • 最终,dp[N]即为所求的结果,表示前N个案件能够得到的最大利益值总额。

通过动态规划的方法,Mike可以根据这个方程计算出最大利益值总额,并将案件分组,使得利益值总额最大化。

代码实现如下:

import java.util.*;

public class Main {
    public static int maximizeProfit(int[] profits) {
        int n = profits.length;
        int[] dp = new int[n + 1];

        for (int i = 1; i <= n; i++) {
            int maxVal = profits[i - 1];
            int minVal = profits[i - 1];
            dp[i] = dp[i - 1]; // Case where current case forms a single group

            for (int j = i - 1; j >= 1; j--) {
                maxVal = Math.max(maxVal, profits[j - 1]);
                minVal = Math.min(minVal, profits[j - 1]);
                dp[i] = Math.max(dp[i], dp[j - 1] + maxVal - minVal);
            }
        }

        return dp[n];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] profits = new int[N];
        for(int i = 0; i < N; ++i){
            profits[i] = sc.nextInt();
        }
        int result = maximizeProfit(profits);
        System.out.println(result);
    }
}

三、测试结果截图

输入

5
1 3 2 4 5

输出结果如下

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连续子序列最大最小值差额最大化 的相关文章

随机推荐

  • rabbitmq基础7——队列和消息过期时间设置、死信队列、延迟队列、优先级队列、回调队列、惰性队列

    文章目录 一 过期时间 1 1 针对队列设置 1 2 针对消息设置 二 死信队列 2 1 死信交换器 2 2 死信队列原理 2 3 延迟队列 特殊用法 三 优先级队列 3 1 监控页面创建优先级队列 3 2 监控页面创建优先级消息 四 回调
  • 【有限元分析】网格形状和网格尺寸对结果的影响——以矩形杆的静力分析为例

    本文研究了网格形状和网格尺寸对计算结果的影响 现研究一个矩形截面的杆件 如图1 1 对其末端施加两种等效的载荷 在末端面施加remote force 100N的力 如图1 2所示 对杆件进行2种网格形状划分 分别是六面体网格和四面体网格 如
  • 金融术语总结

    洗钱 将犯罪或其他非法违法行为所获得的违法收入 通过各种手段掩饰 隐瞒 转化 使其在形式上合法化的行为 存量客户 某个时间段里原先已有的客户 与新增客户相对应 月活跃用户数量 MAU Monthly Active User MAU 是当月登
  • 网页常用小技巧(JavaScript)

    1 nc ntextmenu window event returnValue false 将彻底屏蔽鼠标右键 table border border td no td table 可用于Table 2 取消选取 防止复制 3 npaste
  • java日志框架详解

    一 日志的概念 日志文件是用于记录系统操作事件的文件集合 可分为事件日志和消息日志 具有处理历史数据 诊断 问题的追踪以及理解系统的活动等重要作用 二 现有的日志框架 JUL java util logging logback log4j
  • Swagger注解详解

    目录 1 Api 2 APiOperation 3 ApiImplicitParams 4 ApiResponses 5 ApiModel 6 ApiModelProperty 这里是说明常用注解的含义和基本用法 也就是说已经对swagge
  • 使用反射对单例模式进行攻击的讨论

    我们都知道在单例模式中 对构造函数进行私有化private修饰 保证了类不能使用new进行对象的实例化 但是如果使用反射获取构造函数 在进行实例化就会导致private失效 作者用中文作为类名 请读者勿怪 纯属喜好 工作中是不允许的哦 ja
  • 为什么我们要考虑线性规划的对偶问题?

    文章转自 https www zhihu com question 26658861 版权归原作者
  • 更改计算机bios密码怎么办,计算机BIOS通用密码的修改

    电脑信息的保密一直是一个重要的话题 众所周知 在BIOS设置菜单中 有两个密码设置栏目 Supervisor Password 超级用户密码 和User Password 一般用户密码 可以说是电脑资料保密的第一道防线 这两组密码搭配BIO
  • 2023届秋招,我重新认清了自己

    仅记录个人经历 充满主观感受 甚至纯属虚构 仅供参考 杠就是你对 本想毕业再写 但是考虑到等毕业了 24秋招的提前批就快开始了 大概就来不及了 正好现在有点时间 陆陆续续的写了出来 个人情况 学历 苏北二本 加南京某211 现在二本三本合并
  • 【转载】PMOS,NMOS

    NMOS保证截止 发生在G电位小于等于S PMOS保证截止 发生在G电位大于等于S 寄生二极管是因为基底与Source连接形成的PN结
  • JQuery获取多个name相同select/input框的value值

    JavaWeb jsp页面 使用c forEach 循环多个select下拉框 name相同获取被选中的值 jsp
  • 虚拟机连接不上网络,解决办法

    虚拟机连接不上网络解决思路 简单的介绍了VM虚拟机常用的三种网络连接方式 一般用NAT方式虚拟机就很容易上网的 所以一般没有特殊要求推荐用NAT方式 1 桥接 就是把虚拟机通过VMnet0桥接到主机的本地连接 现在虚拟机是通过VMnet0与
  • NestedScrollView RecycleView 嵌套 滑动冲突

    NestedScrollView RecycleView 嵌套 滑动冲突 场景描述 效果演示 实现思路 问题和优化 优化 参考文档 场景描述 使用NestedScrollView 内嵌RecycleView时 当用户上滑时 NestedSc
  • 扫雷(初阶)

    细节决定成败 目录 打印菜单 创建棋盘并打印 埋雷 排雷 判断输赢 扫雷游戏规则 当棋盘内除去有地雷的格子 全被排除那么就会胜利 反之当玩家排到一颗雷就会被炸西 根据三子棋的写法 扫雷程序也是需要分为几个文件 声明函数的文件 定义函数的文件
  • Samba+ldap认证(LDAP搭建)

    Samba ldap认证 题目 LDAP 一 关闭Selinux跟防火墙 二 安装ldap 三 设置slapd密码 四 修改配置文件 五 启动服务ldap服务并导入基本Schema 六 导入基础数据库和用户组 七 导入用户 八 修改配置文件
  • Qt的内存管理机制

    当我们在使用Qt时不可避免得需要接触到内存的分配和使用 即使是在使用Python Golang这种带有自动垃圾回收器 GC 的语言时我们仍然需要对Qt的内存管理机制有所了解 以更加清楚的认识Qt对象的生命周期并在适当的时机加以控制或者避免进
  • go语言连接mysql数据库,并验证连通性

    go语言连接mysql数据库 并验证连通性 package main import database sql sql Open加载包 github com go sql driver mysql 没用到包里的内容但是需要加载一下这个包 lo
  • 2023年MathorCup 高校数学建模挑战赛-A 题 量子计算机在信用评分卡组合优化中的应用-思路详解(模型代码答案)

    一 题目简析 运筹优化类题目 不同于目标规划 该题限制了必须使用量子退火算法QUBO来进行建模与求解 本身题目并不难 但是该模型较生僻 给出的参考文献需要耗费大量时间去钻研 建议擅长运筹类题目且建模能力强的队伍选择 二 逐问思路分享 问题
  • 连续子序列最大最小值差额最大化

    本文为最近做过的一道编程笔试题 代码实现方式多种多样 此处本人提供的代码可以获得正确解 仅供大家参考 目录 一 题目描述 二 实现代码程序 三 测试结果截图 一 题目描述 题目描述 Mike在一家律师事务所工作 他的老板Harvey分配给他