ACdream群OJ 1074 风之国 单调队列优化DP

本文介绍了一道ACM竞赛题目,通过排序和动态规划解决城市间的矛盾关系问题,以最小化解决这些矛盾所需的费用。

题目连接:http://acdream.info/problem?pid=1074

思路:

首先,按xi值排序,处理顺序,按排序后的顺序依次给城市编号。记矛盾关系为[u,v](排序后的点),按v值从小到大排序。思考,发现v值一样的矛盾关系,只需取其中最大的u则可。

用dp[i]表示:处理了v值为1-i的所有矛盾关系的最小花费。dp[i]的具体怎么转移呢?枚举最后一条删除的边,得到转移方程dp[i] = min( dp[j] + x[j+1]-x[j] )。需要注意,不是任意一个边都可以作为最后一条边的。j的最小值是i以及i之前的最小的u。

然后,因为转移中的j是不降的,则维护 dp[j] + x[j+1]-x[j] 的单调性即可。

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<map>
#include<set>
using namespace std;
#define MP(x,y) make_pair((x),(y))
#define PB(x) push_back(x)
typedef long long LL;
//typedef unsigned __int64 ULL;
/* ****************** */
const int INF=1000111222;
const double INFF=1e100;
const double eps=1e-8;
//const LL mod=1000000007;
const int NN=100010;
const int MM=2000010;
/* ****************** */

struct node
{
    int x,id;
}a[NN];
int dui[NN],limit[NN],q[NN],cost[NN];
int dp[NN];

bool cmp(node aa,node bb)
{
    return aa.x<bb.x;
}

void solve(int n)
{
    int i,head,tail,temp;
    int pre=limit[1];

    q[head=tail=0]=0;
    cost[0]=0;
    for(i=1;i<=n;i++)
    {
        pre=max(pre,limit[i]);

        while(q[head]<pre)
            head++;

        dp[i]=cost[head];

        temp=dp[i]+a[i+1].x-a[i].x;

        while(head<=tail && temp<=cost[tail])
            tail--;

        q[++tail]=i;
        cost[tail]=temp;
    }
    printf("%d\n",dp[n]);
}

int main()
{
    int n,m,i;
    int u,v;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i].x);
            a[i].id=i;
        }
        sort(a+1,a+1+n,cmp);
        for(i=1;i<=n;i++)
        {
            dui[ a[i].id ]=i;
        }
        memset(limit,-1,sizeof(limit));
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            u=dui[u];
            v=dui[v];
            if(u>v)
                swap(u,v);
            limit[v]=max(limit[v],u);
        }

        solve(n);
    }
    return 0;
}


代码下载地址: https://pan.quark.cn/s/a4b39357ea24 在计算机视觉技术中,数据集扮演着训练和评估模型的核心角色。Labelme作为一个广受欢迎的开源工具,能够支持用户以交互方式对图像进行标注,而COCO(Common Objects in Context)则是一种被广泛采纳的数据集标准格式,适用于包括物体检测、图像分割在内的多种任务。本文将详细阐述如何将Labelme生成的标注数据转换为COCO数据集的标准格式。 Labelme标注的图像在输出为JSON格式时,会包含以下核心内容: 1. `version`: 指明JSON文件的版本信息。 2. `flags`: 目前未定义或保持为空,预留用于未来的功能扩展。 3. `shapes`: 列表形式存储对象的形状信息,每个形状项包含`label`(对象类别名称),`points`(构成对象边缘的多边形顶点),以及`shape_type`(通常为“polygon”)。 4. `imagePath`和`imageData`: 提供原始图像的存储路径和二进制数据,便于后续图像的还原。 5. `imageHeight`和`imageWidth`: 明确标注图像的垂直和水平尺寸。 COCO数据集的标准格式中定义了三种主要的标注类型: 1. Object instances(目标实例):主要用于执行物体检测任务。 2. Object keypoints(目标上的关键点):适用于人体姿态估计相关应用。 3. Image captions(看图说话):用于生成图像的文本描述。 COCO的JSON结构中包含以下基本组成部分: 1. `images`:记录图像的基本属性,包括`height`(高度)、`...
内容概要:本文围绕基于Basisformer模型的时间序列锂离子电池SOC(State of Charge,荷电状态)预测展开研究,利用PyTorch深度学习框架构建并训练模型,旨在提升锂电池SOC估计的准确性与鲁棒性。该方法融合Transformer架构的核心机制,通过引入基函数(Basis)分解策略,有效捕捉电池充放电过程中长时序、非线性动态特征,增强模型对复杂工况的适应能力。研究不仅详细阐述了Basisformer的网络结构设计、注意力机制优化与训练流程,还提供了完整的Python代码实现方案,涵盖数据预处理、模型搭建、损失函数定义、训练验证及结果可视化等环节,便于科研人员快速复现、调优并拓展至其他电池状态预测任务。; 适合人:具备一定深度学习与Python编程基础,熟悉PyTorch框架,从事电池管理系统(BMS)、新能源汽车、储能系统、智能传感等领域的高校研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于动力电池与储能系统的实时SOC估算模块,提升系统安全性与能量利用效率;②作为学术研究的基础模型,用于复现、改进基于Transformer的时间序列预测方法在电化学系统中的应用;③为数据驱动的电池健康状态(SOH)、剩余使用寿命(RUL)联合估计提供可扩展的技术框架。; 阅读建议:建议读者结合所提供的代码与公开电池数据集(如NASA、CALCE等)进行动手实践,深入理解模型的输入输出结构与时序建模逻辑,同时可尝试引入温度、老化周期等多维特征,或融合物理模型构建混合预测架构,以进一步提升预测精度与泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值