算法设计与分析 SCAU8597 石子划分问题

news2025/1/19 19:18:43

8597 石子划分问题

时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0

在这里插入图片描述

题型: 编程题 语言: G++;GCC;VC;JAVA

Description

给定n个石子,其重量分别为a1,a2,a3,…,an。
要求将其划分为m份,每一份的划分费用定义为这份石子中最大重量与最小重量差的平方。
总划分费用为m份划分费用之和。

现在对于给定的n个石子,求一种划分方案,使得总划分费用最小。


输入格式

第一行两个正整数n和m,接下来一行有n个正整数,表示一个石子的重量ai。(1≤n, m, ai≤1000)


输出格式

计算输出最小总划分费用。

注意:若一份只有一个石子,那么,这份石子中最大重量与最小重量的差的平方为0。


输入样例

4 2
4 7 10 1


输出样例

18


解题思路

  1. 先将石子重量从小到大排序(从大到小也可以).
  2. 假设f(n, m)表示:n 个石头分成 m 份的最小费用. 特别的,有 f(1,1)=0; f(n,1)=(an - a1)^2
    那么,除去最后一份石头的若干个,前面 m - 1 份必定也是最优的分法.
    若最后一堆1个石头, f(n,m) = f(n-1,m-1)+0^2
    若最后一堆2个石头, f(n,m) = f(n-2,m-1)+(an - an-1)^2
    若最后一堆3个石头, f(n,m) = f(n-3,m-1)+(an - an-2)^2

    最后一堆最多只能有 n - m + 1 个石头,因为当最后一堆为 n - m + 1 时,前面 m - 1 堆已经是一个一份了.
    因此, f(n,m) = Min{ f(n-1,m-1)+0^2, f(n-2,m-1)+(an - an-1)^2, …}

例如:
n=5, m=2
a[1…5] = 1 3 4 8 9
f(5,2)=Min{ f(4,1)+0; f(3,1)+1; f(2,1)+5^2 }=Min{49,10,29}=10
这5个石头分2堆的最优分法:(1 3 4)(8 9)


1. dp 方程定义

  • dp[n][m]; // 前 n 堆石头分成 m 份


2. 状态转移方程

dp[n][m] = dp[n - k][m - 1] + (a[n] - a[n - k + 1]) * (a[n] - a[n - k + 1])
假设最后一份石头有 k 堆,则 dp[n][m] 为前 n - k 堆中挑选出 m - 1 份的得分,加上最后这一份的石头得分,得分为最后一堆减去第一堆的平方(因为已经升序排序,所以最大的在这一份最后,最小的一定在这一份开头)


3. 算法解题思路

  1. 将石堆进行排序(我采取的方法是升序排序),保证随意取一段区间,该区间中最小质量石堆一定在开头,最大质量石堆一定在最尾。
  2. 外层循环为遍历到前 i 堆,第二层循环为划分为 j 份,第三层循环为最后一份中有 k 堆,对于第三层循环,通过一个变量 minNum 来获取到当最后一份有不同石堆数时,最小得分是多少。
  3. 最后当跳出第三层循环,即该份数下划分完毕时,对 dp[i][j] 进行赋值即可 dp[i][j] = minNum;



更多注释可查看下方的完整代码中,有助于理解

代码如下

#include <iostream>
#include <cmath>
#include <string.h>
#include<algorithm>
/*
4 2
4 7 10 1

5 2
1 3 4 8 9
*/

using namespace std;

int a[1001];
int dp[1001][1001]; // 前 n 堆石头分成 m 份

int main()
{
    int i, j, k, n, m;
    cin >> n >> m;

    for(i = 1; i <= n; i++) {
        cin >> a[i];
    }

    sort(a + 1, a + n + 1);

    memset(dp, 1e9, sizeof(dp));

    // 前 i 堆石头划分成1堆,只有一种分法,也就是全部放一起
    for(i = 1; i <= n; i++) {
        dp[i][1] = (a[i] - a[1]) * (a[i] - a[1]);
    }

    for(i = 2; i <= n; i++) {
        for(j = 2; j <= m; j++) {
            // 划分后,最后一堆石头有 k 个,例如如果5堆石头划分成2份,最后一堆石头可以有1,2,3,4堆
            int minNum = 1e9;
            for(k = 1; k <= i - j + 1; k++) {
                minNum = min(minNum, dp[i - k][j - 1] + (a[i] - a[i - k + 1]) * (a[i] - a[i - k + 1]));
                //cout << "i=" << i << " j=" << j << " k=" << k << " dp[" << i-k << "][" << j - 1 << "]=" << dp[i - k][j - 1] << " a=" << a[i] - a[i - k + 1] << endl;
            }
            dp[i][j] = minNum;
            //cout << "dp[" << i << "][" << j << "]=" << dp[i][j] << endl;
        }
    }

    cout << dp[n][m] << endl;
    return 0;
}


最后

对我感兴趣的小伙伴可查看以下链接

  • 我的掘金主页:https://juejin.cn/user/1302297507801358
  • 博客主页:http://blog.zhangjiancong.top/
  • 公众号:Smooth前端成长记录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nRF52832闪存FDS使用(SDK17.1.0)

陈拓 2022/10/29-2022/11/22 1. 简介 对于Nordic芯片内部FLASH存储管理有两种方式&#xff0c;FS (Flash Storage)和FDS (Flash Data Storage) 。FS是FDS的底层实现&#xff0c;FDS是对FS的封装&#xff0c;使用更容易。 Flash Data Storage&#xff08;FDS&#xff09;模块是…

容器与容器编排系统

Docker公司发明的「容器镜像」技术&#xff0c;创造性地解决了应用打包的难题。改变了一大批诸如容器编排、服务网格和云原生等技术&#xff0c;深刻影响了云计算领域的技术方向。 一、Docker 容器技术 概括起来&#xff0c;Docker 容器技术有3个核心概念容器、镜像和镜像仓库…

当3A射击游戏遇上Play to Earn,暴躁兔带你了解MetalCore

MetalCore是一款具有机甲风格的战斗射击类的Play to Earn & Free to Play游戏&#xff0c;暴躁兔对这款游戏之前也有做过分析&#xff0c;MetalCore在近期启动了alpha开放世界测试&#xff0c;之前有NFT的玩家获得key code之后可以在PC端下载后进行体验。alpha阶段在10月20…

如何使IOT2050成为PN设备

Profinet Driver&#xff08;PNDriver&#xff09;从V2.3开始支持IO设备(IOD)功能&#xff0c;支持通用网络接口和Linux操作系统&#xff0c;最小支持2ms的通讯周期。本文介绍如何编译PNDriver并运行在IOT2050上。 1. 编译PNDriver 因为PNDriver只支持32位模式&#xff0c;因…

TiDB ——TiKV

TiDB ——TiKV TiKV持久化 TiKV架构和作用TiKV数据持久化和读取TiKV如何提供MVCC和分布式事务支持TiKV基于Raft算法的分布式一致性TiKV的coprocessor TiKV架构和作用 数据持久化分布式一致性MVCC分步式事务Coprocessor RocksDB 单机持久化引擎&#xff0c;单机key-value的…

L2十档行情API接口的开发原理是什么?

L2十档行情API接口的开发原理不知道大家有没有了解过&#xff0c;其实在现实的股市量化交易中&#xff0c;就有不少的投资者也在思考这个问题&#xff0c;并且也有的部分交易者会选择自己开发来使用&#xff0c;不仅支持A股所有的股票数据&#xff0c;也能对期货、外汇、黄金等…

个人项目-部署手册

前言 一、RDS和ECS购买与配置 https://www.aliyun.com/?spm5176.12818093.top-nav.dlogo.3be916d0u0Ncp9 购买RDS(MYSQL)和ECS(规格族&#xff1a;突发性能实例 t6 )的时候尽量选择一个大区》如&#xff1a;华东&#xff08;杭州&#xff09;配置不需要太高(够自己使用就行了…

干货分享 | B站SLO由失败转成功,B站SRE做对了什么?

最近几年&#xff0c;Google SRE在国内非常流行。 Google SRE方法论中提出了SLO是SRE实践的核心&#xff0c;SLO为服务可靠性设定了一个目标级别&#xff0c;它是量化线上质量的关键因素&#xff0c;它是用来回答一个服务到底“什么时候叫做挂了”的根本依据&#xff0c;也是可…

Python网络爬虫入门篇

1. 预备知识 学习者需要预先掌握Python的数字类型、字符串类型、分支、循环、函数、列表类型、字典类型、文件和第三方库使用等概念和编程方法。 2. Python爬虫基本流程 a. 发送请求 使用http库向目标站点发起请求&#xff0c;即发送一个Request&#xff0c;Request包含&am…

xxl-job 执行成功,但是报“任务结果丢失,标记失败“错误

问题1:使用xxl定时更新数据,发现执行结果是失败的 打开日志查看,发现没报错,结果是200 打开备注,上面写着"结果丢失". 再仔细对比下,发现外面日志列表中的执行时间是00:20:18;而日志记录中的最后时间是00:39:32;也就是说线程还没执行完,就先报结果错误了. 对比日志时…

[附源码]Python计算机毕业设计宠物寄养管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Jmeter压力测试教程(上)

JMeter压力测试一、 简介1.1优点1.2缺点二、安装2.1下载2.2解决中文乱码问题2.5配置环境变量2.4启动入门案例三、线程组相关3.1 创建多个线程组3.2 并发和顺序执行3.3 两个特殊的线程组&#xff08;setUp/tearDown&#xff09;线程细节设置默认http请求新增接口信息头管理器四、…

SAP ADM100-1.2之系统登录过程(ABAP)

1、SAP登录过程 为了在前端最终用户和SAP系统实例之间创建连接,sapgui.exe程序需要启动参数。参数字符串是由saplogon .exe程序使用为登录选择的SAP GUI的信息创建。 SAP登录信息有以下两个来源:SAP Logon的配置文件,以及对所选系统的消息服务器的直接请求(下图中的步骤1和…

使用Go+Lua解决Redis秒杀中库存与超卖问题

1、简介 Go语言连接go-redis进行数据库的连接&#xff0c;如果你对这部分尚不了解&#xff0c;建议你先学习这部分知识。另外&#xff0c;本秒杀主要解决两个问题&#xff0c;第一个就是超卖问题&#xff0c;另一个就是库存问题。没有设计专门的页面来模拟并发&#xff0c;我们…

布谷蓝途:易知微「可视大脑助力智慧教育」主题分享精彩实录

如今&#xff0c;大数据技术在教育领域的应用与普及正驶入“快车道”&#xff0c;但仍然存在资源管理分散、数据各自为阵、运营模式传统等痛点&#xff0c;如何借助新技术、新机遇并充分发挥大数据在教育教学中的支撑作用成为重中之重。 布谷蓝途作为国内前沿的大数据方案与服…

网分测试线缆怎么选?

如何在众多选择中寻找到最佳的测试电缆?以下内容由普科科技PRBTEK整理&#xff0c;以下内容将阐述电缆与电缆组件的机械及电气性能&#xff0c;以及如何选择您理想的测试电缆。 2004年5月&#xff0c;美国时代微波系统公司的测试工程师对50欧姆测试电缆的要求作出以下概述&…

银河麒麟桌面操作系统V10安装过程

文章目录下载镜像导入VMware启动安装下载镜像导入VMware 首先去麒麟生态网站注册登录&#xff0c;找到适合自己版本的操作系统 打开VMware新建虚拟机 把镜像放进来 选择Liunx的ubuntu版本 分配处理器和内核 分配内存 后面的就网络、I/O、硬盘按照默认配置就行 启动安装 …

二叉树的建立和遍历

目录创建二叉树中的引用使用遍历顺序创建二叉树使用先序遍历和中序遍历创建二叉树使用中序和后序创建二叉树中序求二叉树用栈实现非递归遍历先序遍历中序遍历后序遍历用栈通过出栈次数进行遍历中序遍历后序遍历队列进行层次遍历思路代码判断是否是满二叉树和完全二叉树递归非递…

面向开发者的开源低代码开发工具,强烈推荐!

每家公司在发展过程中都需要构建大量的内部系统&#xff0c; 比如运营使用的用户管理后台&#xff0c;销售线索后台&#xff0c;双十一活动后台&#xff0c;圣诞节活动后台等。 许多公司内部也都有专门的研发团队负责开发各种各样的后台和内部工具&#xff0c;大量的公司为此付…

Qt开发-QT Quick

前言 QT Quick和Qt widgets这两种技术&#xff0c;官方是强推QT Quick的。 QT Quick中布局一般有如下四种方式&#xff0c; 绝对坐标&#xff1a;x、y、z、width、height、top、left锚(anchors) 布局定位器&#xff08;Row、Column、Grid、Flow&#xff09;布局管理器&#…