HDU-3480 Division 【DP+斜率优化(二维)】

题目链接

题意

定义一个集合的花费是这个集合中的最大值减最小值的平方。然后给定一个集合S,求对这个集合的一个覆盖,使得所有子集的花费和最小。

分析

本身这个题是非常简单的,只是今天看了别人的题解,我发现我以前写的二维斜率优化都写复杂了。直接外层循环用未被优化的那一维就行了,不用像我以前那样维护一个k维的单调队列……我说怎么不对劲,每次看别人的代码都那么短……
具体见代码

AC代码

//HDU-3480 Division
//AC  2017-3-11 14:52:18
//DP, slope trick(2d)
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+100,maxm=5e3+100;

int N,M;
int dp[maxn][2],a[maxn];
int que[maxn];
int head,tail;

int getx(int j)
{
    return a[j+1];
}

int gety(int j,int flag)
{
    return dp[j][!flag]+a[j+1]*a[j+1];
}

void insert(int i,int flag)
{
    while(tail>head+1&&
          (gety(i,flag)-gety(que[tail-1],flag))*(getx(que[tail-1])-getx(que[tail-2]))<=
          (gety(que[tail-1],flag)-gety(que[tail-2],flag))*(getx(i)-getx(que[tail-1])))
            tail--;
    que[tail++]=i;
    return;
}

int get_front(int i,int flag)
{
    while(tail>head+1&&
          (gety(que[head+1],flag)-gety(que[head],flag))<=(getx(que[head+1])-getx(que[head]))*2*a[i])
            ++head;
    return gety(que[head],flag)-2*a[i]*getx(que[head]);
}


int main()
{
    int T;scanf("%d",&T);
    for(int kase=1;kase<=T;++kase)
    {
        scanf("%d %d",&N,&M);
        if(N<=M)
        {
            printf("Case %d: 0\n",kase);
            continue;
        }
        for(int i=1;i<=N;++i)
            scanf("%d",a+i);
        sort(a+1,a+1+N);
        memset(dp,0x3f,sizeof dp);
        int flag=0;
        for(int i=1;i<=N;++i)
            dp[i][flag]=(a[i]-a[1])*(a[i]-a[1]);
        flag=!flag;
        for(int k=2;k<=M;++k)
        {
            head=tail=0;
            dp[1][flag]=dp[1][!flag];
            insert(1,flag);
            for(int i=2;i<=N;++i)
            {
                dp[i][flag]=get_front(i,flag)+a[i]*a[i];
                insert(i,flag);
            }
            flag=!flag;
        }
        /*for(int i=1;i<=N;++i)
        {
            dp[i][1]=(a[i]-a[1])*(a[i]-a[1]);
            insert(i,1);
            for(int k=2;k<=min(M,i);++k)
            {
                dp[i][k]=get_front(i,k-1)+a[i]*a[i];
                insert(i,k);
            }
        }*/
        printf("Case %d: %d\n",kase,dp[N][!flag]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/DrCarlluo/p/6580569.html

【DRAM存储器六十六】DDR5介绍--训练相关之CA/CS Training 详述DDR5 CA/CS training过程细节 阅读详情

相关推荐

SolidWorks草图绘制实战:如何用图片参考快速搞定智能小车底板设计

本文详细介绍了在SolidWorks中利用图片参考进行草图绘制的实战方法,以智能小车底板设计为例,帮助设计师快速将概念转化为精准三维模型。通过插入、对齐参考图片并高效描图,结合参数化约束与尺寸驱动,大幅提升设计效率和准确性,尤其适合新手入门与老手优化工作流。

rust6ferris的博客 208

HDU 2829 (二维斜率优化)

题意 给你长度为n的序列,可以切m刀将序列切成m+1个子段。每个子段的价值为子段中任意两个数的乘积的总和,让总价值最小。 思路 定义数组s[i]=∑a[i]s[i]=\sum a[i]s[i]=∑a[i],数组e[i]=∑a[i]2e[i]=\sum a[i]^2e[i]=∑a[i]2。 定义状态f[i][k]f[i][k]f[i][k]代表前i个数,且k刀的最小价值。可以这样转移 f[i][k]...

No cost too great! 304

VisualStudio2022配置CGAL

vs2022和vs2017安装配置boost没什么区别,只需要注意boost的msvc得是14.3的,这玩意跟visualstudio版本挂钩的。压缩包解压,得到下面这两文件,然后把auxiliary这个文件挪到CGAL-5.6里面就行了。我用cgal读取一个stl模型,并输出相关信息(想可视化的话需要安装Qt,不想装Qt也可以装VTK)然后下载下面这两个压缩包。照着下面的截图填就完事了。

weixin_43850909的博客 1162

BZOJ4518——二维斜率优化dp

Description Pine开始了从S地到T地的征途。 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。 Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。 Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。 帮助Pine求出最小方差是多少。 设方差是v,可以证明,v×m^2...

stevensonson的博客 603

Linux | Ubuntu18.04安装WIFI6 AX201驱动完整教程

本节介绍了如何在Ubuntu18下安装AX201驱动的教程。

九七的博客 8868

TIM 2024 | AD-YOLO:一种结合 Swin Transformer 和注意力机制的实时 YOLO 网络用于机场场景检测

实时获取机场场景信息对于保障机场安全和提升机场运营效率至关重要。然而,机场场景图像中的人员和车辆目标尺寸较小,而且公开的机场数据不足,这使得机场物体检测成为一项颇具挑战的任务,难以同时实现高精度和实时检测。本文提出了一种全新的机场物体检测方法——机场检测器YOLO(AD - YOLO),它融合了改进的你只看一次(YOLO)算法、Swin Transformer和注意力机制的优势,以应对这一挑战。

小白学视觉 310

hdu2829之二维斜率优化DP

T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in the Arabian theater and led a group of Arab nationals in guerilla strikes against the Ottoman Empir

Stephen 2804

CarSim - 仿真汽车驾驶行为的完整源代码及描述

以上是多年收集的稀有软件CarSim的源代码和描述,借助CarSim提供的功能,用户可以准确地模拟和研究汽车的驾驶行为,为汽车设计、驾驶辅助系统等领域提供有价值的支持。是一款用于模拟汽车驾驶行为的稀有软件,它经过多年的收集和开发,提供了一套完整的源代码和相应的描述,能够准确地模拟真实世界中的汽车运动和操控。CarSim的源代码采用现代化的。

weixin_50547796的博客 288

HDU 2829 Lawrence (斜率DP)

Lawrence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1523    Accepted Submission(s): 671 Problem Description T. E. Lawrence was a controv...

weixin_34082177的博客 189

FOC高频注入量产级C语言实现方案

高频注入技术是无传感器FOC实现零速和低速控制的关键方法,解决了传统反电动势观测器在低速失效的问题。该技术通过向电机注入高频电压信号,利用永磁同步电机凸极性特性,从高频电流响应中解调出转子位置信息。文章详细介绍了三种主流高频注入方法(旋转电压注入、脉振电压注入和脉振电流注入)的原理及实现流程,重点分析了脉振电压注入的信号处理步骤和位置观测器设计。同时提供了完整的C语言实现代码,包括硬件抽象层、核心算法模块(坐标变换、电流环、SVPWM等)和系统集成方案,并给出量产优化建议和安全保护机制。这套方案适用于要求高

汽车软件开发 779

STM32F103RCT6的FLASH读写操作

STM32F103RCT6是一款常用的32位微控制器,它具有内置的FLASH存储器,可以用于存储程序代码和数据。在本文中,我们将详细介绍如何进行STM32F103RCT6的FLASH读写操作,并提供相应的源代码。写入数据时,我们通过将数据直接写入FLASH地址来完成。通过使用适当的API和规则,我们可以有效地读取和写入数据。写入FLASH时,我们需要按特定的规则进行编程。首先,我们需要包含适当的头文件和定义相关的宏和变量,以便在代码中使用FLASH API。类型的指针,我们可以直接读取FLASH中的数据。

UplKubernetes的博客 1029

HDU3480 Division【二维斜率优化DP+滚动数组】

Time Limit: 10000/5000 MS (Java/Others)Memory Limit: 999999/400000 K (Java/Others) Problem Description Little D is really interested in the theorem of sets recently. There’s a problem that conf...

MaJorieL 187

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

hdu3480 Division(斜率优化+二维DP)

点击打开链接 题意:给你一些数,把这些数分成M组,每组的花费是这组的 (max-min)^2。求最小花费 思路: 斜率优化+二维DP f[i][m] 表示将前i个分作m个集合所得最小消费 首先应该排序,假设1,2,3,5,4   第四个数是5,花费一定比是4大。【贪心】 f[i][m] = min{f[j][m-1]+(a[i]-a[j+1])*(a[i]-a[j+1])};   排

yxg_123的博客 396

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

hdu3480 Division(四边形不等式优化dp||二维斜率优化dp)

题目链接 题目描述: 把一个大集合分成M个小集合,集合的花费是(maxnum−minnum)2(maxnum−minnum)2(maxnum-minnum)^2 求最小花费 分析: mmp,题面一定要看明白再想问题 显然,每个元素属于一个子集就够了 贪心的,我们可以把尽量相近的数字分到一个集合里 把数字排好序 有方程:f[i][j]f[i][j]f[i][j]表示前iii个数分成...

Coco_T的博客 392

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HDU 3480 Division

Problem Description Little D is really interested in the theorem of sets recently. There’s a problem that confused him a long time. Let T be a set of integers. Let the MIN be the minimum integer i

jjs98 820

HDU 3480 Division (两个状态的斜率优化DP)

Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Total Submission(s): 5327    Accepted Submission(s): 2103 Problem Description Little D is really

咸鱼有梦想 307

Division(斜率优化 四边形优化 dp)

原题: http://acm.hdu.edu.cn/showproblem.php?pid=3480 题意: n个数排序后,分成多段,每一段是最大值减最小值的平方,求和的最小值。 解析: 老套路: dp[i][j]dp[i][j]dp[i][j]表示前面j个数分成i段的最小值,有dp[i][j]=min(dp[i−1][k]+(s[j]−s[k+1])2)dp[i][j]=min(dp[i-1][...

QAQ 447

hdu 3480 Division(斜率优化/四边形不等式)

题意:给你一堆数,让你组成m个集合,集合的价值是集合内元素的最大值与最小值的差的平方,求m个集合的价值总和最小 思路: 先给出TLE代码,斜率优化下次给出,转移方程dp[i][j]=min(dp[i][j],dp[i-1][k]+(a[j]-a[k+1])*(a[j]-a[k+1]));(ps:tzw竟然说买包烟十个人,九个人都会斜率优化过题,emmm) #include <bit...

weixin_30515513的博客 151

HDU - 3480 Division(斜率优化)

题目大意:给出N个数,要求你将N个数分成K个集合,使每个集合的(最大值 - 最小值)^ 2和达到最小解题思路:先排个序,从小打大排 设dp[i][j]为前i个数分成j个集合最小平方和 得到转移方程dp[i][j] = dp[k][j - 1] + (val[i] - val[k + 1]) ^ 2 val[i]为第i个数的值 设l > k,且点l比点k优 则dp[k][j - 1] + (

静静地码 777

hdu 3480

排个序,很容易可以证明出四边形不等式#include #include const int MAXN = 1000 + 123; int dp[MAXN][MAXN], cost[MAXN][MAXN]; int s[MAXN][MAXN]; int sum[MAXN], a

hqd_acm的专栏 1068

hdu-3480-Division-dp-斜率优化

题意就是:一段区间的值就是max-min的平方,求n个点分成m线段的最小值 基本的DP式子是dp[i][x]=dp[j][x-1]+(a[i]-a[j+1])^2 然后用斜率优化 yj=dp[j][x-1]+a[j+1]^2

lyc1635566ty的博客 319

hdu3669之二维斜率DP

Cross the Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others) Total Submission(s): 4176    Accepted Submission(s): 748 Problem Description “Across th

Stephen 1687

hdu3480之二维斜率优化DP

Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Total Submission(s): 2664    Accepted Submission(s): 1050 Problem Description Little D is re

Stephen 2011
上一篇: POJ-1180 Batch Scheduling 【逆向DP+斜率优化】
下一篇: HDU-3045 Picnic Cows 【DP+斜率优化】
a18235146924
博客等级 码龄12年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值