能量消耗:一个前缀和优化 dp 的大典题,要是数据水一点 \(O(n^3)\) 都能硬草过去。

思路

显然,定义 \(dp[i]\) 为考虑前 \(i\) 个塔,并且将第 \(i\) 个塔开启,将前面的精灵全部收集的最小代价。

于是转移:

\[dp[i]=min(dp[i],dp[j]+w(j,i)+c[i])
\]

其中 \(0\le j<i \le m\) ,\(w(j,i)\) 表示收集从塔 \(j\) 到 \(i\) 的所有精灵到塔 \(i\) 所花费的代价。

总体复杂度 \(O(n^3)\) ,\(1000\) 数据卡的有点紧,我们尝试优化。

前缀和优化

对于 \(w(j,i)\) ,发现它可以由 \(w(j,i-1)\) 和他们之间的精灵计算得来。

于是我们枚举每一个起点 \(j\) ,后面扫一遍所有塔确定 \(i\) ,顺带用一个指针维护。

这题恶心之处就在于这个指针的边界特判。

\(O(n^2)\) 计算完 \(w(j,i)\) 后, dp 复杂度就降为 \(O(n^2)\) 了,可以过。

坑点

因为 \(dp[i]\) 表示的是第 \(i\) 个塔开启时的最小花费,所以可能出现最后一个塔不开启的情况,答案不一定是 \(dp[m]\) 。

因此,我们统计答案的时候,只需要找满足位置大于等于最后一个精灵的位置的塔的 \(dp\) 值,取一个 \(\min\) 即可。

场上没判这点,怒挂 20pts 。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
ll a[1005],b[1005],c[1005],n,m,w[1005][1005],lst[1005],dp[1005],ans=0x3f3f3f3f3f3f3f3f;
int main()
{
freopen("energy.in","r",stdin);
freopen("energy.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
for(int i=1;i<=m;i++)cin>>b[i];
for(int i=1;i<=m;i++)cin>>c[i];
lst[0]=0;
for(int i=1;i<=m;i++)
{
for(int j=n;j>=1;j--)
{
if(a[j]<=b[i])
{
lst[i]=j;
break;
}
}
}
b[0]=-0x3f3f3f3f;
for(int i=0;i<m;i++)
{
ll now=0,sm=0,p=lst[i]+1,lpos=0;
for(int j=i+1;j<=m;j++)
{
while(p<=lst[j])
{
sm+=now*(a[p]-lpos);
now++;
lpos=a[p];
p++;
}
sm+=now*(b[j]-lpos);
lpos=b[j];
w[i][j]=sm;
}
}
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=m;i++)
{
for(int j=0;j<i;j++)
{
dp[i]=min(dp[i],dp[j]+w[j][i]+c[i]);
}
}
for(int i=1;i<=m;i++)
{
if(a[n]<=b[i])ans=min(ans,dp[i]);
}
cout<<ans;
return 0;
}

HT-018 Div3 能量消耗 题解 [ 绿 ] [ 线性 dp ] [ 前缀和优化 ]的更多相关文章

  1. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  2. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

  3. [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)

    [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列) 题面 两个人玩游戏,共进行t轮,每人每轮从[-k,k]中选出一个数字,将其加到自己的总分中.已 ...

  4. TYVJ1071 LCIS 线性DP+决策集优化

    问题描述 TYVJ1071 题解 暴力\(\mathrm{DP}\) 首先,一个\(O(n^3)\)的解法: 设\(opt_{i,j}\)代表\(a\)的前\(i\)个和\(b\)的前\(j\)个的\ ...

  5. Codeforces 479E. Riding in a Lift (dp + 前缀和优化)

    题目链接:http://codeforces.com/contest/479/problem/E 题意:         给定一个启示的楼层a,有一个不能去的楼层b,对于你可以去的下一个楼层必须满足你 ...

  6. 2018多校第九场 HDU 6416 (DP+前缀和优化)

    转自:https://blog.csdn.net/CatDsy/article/details/81876341 #include <bits/stdc++.h> using namesp ...

  7. 【AHOI2009】中国象棋 题解(线性DP+数学)

    前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...

  8. Mowing the Lawn【线性dp + 单调队列优化】

    题目链接:https://ac.nowcoder.com/acm/contest/2652/G 题目大意:与上一篇博客 烽火传递 差不多. 1.一共n头羊,若超过m头连续的羊在一起,就会集体罢工,每头 ...

  9. LG2893/POJ3666 「USACO2008FEB」Making the Grade 线性DP+决策集优化

    问题描述 LG2893 POJ3666 题解 对于\(A\)中的每一个元素,都将存在于\(B\)中. 对\(A\)离散化. 设\(opt_{i,j}\)代表\([1,i]\),结尾为\(j\)的最小代 ...

  10. bzoj 4899 记忆的轮廓 题解(概率dp+决策单调性优化)

    题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...

随机推荐

  1. vue结合element UI做checkbox全选的tree结构

    由于element UI中的tree可能不能满足项目中的样式需求,所以自己动手结合element中的checkbox全选功能实现了一个符合项目需求的tree.效果如下: html部分: <tem ...

  2. YAML语法基础

    YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言). YAML 的语法和其他高级语言类似,并且可以简单表达清单.散列表,标量等数 ...

  3. ARTHAS 使用

    1.概述 ARTHAS是阿里巴巴 出品的一款java监控工具,本文介绍以下他的基本使用方法. 2.基本操作 2.1 启动 java -jar arthas-boot.jar 2.2 基础命令 命令 说 ...

  4. CCF中国开源大会,中电金信与行业共探AI技术在金融行业的应用和前景

    ​ 10月21日,以"开源联合,聚力共赢"为主题的2023 CCF中国开源大会在长沙开幕.中电金信副总经理.研究院院长况文川参加峰会,在"算力与大模型"主题论坛 ...

  5. 中电金信鲸视:以AI视觉技术为复杂行业场景装上“火眼金睛”

    ​ 作为人工智能和计算机视觉的交叉领域,智能视觉通过仿生人类视觉机能,对不同形式的视觉输入进行处理.理解和决策.现今,智能视觉已成为应用广泛.市场覆盖大.形式多样的产业方向,得到了国家政策的大力支持. ...

  6. 聊一聊坑人的 C# MySql.Data SDK

    一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MyS ...

  7. Anaconda功能、优点、安装步骤(安装视频)

    目录 介绍 功能(包和环境的管理器) 优点(省时省心) 下载地址 安装教程 要点 conda 的常见命令 查询完整帮助文件 管理conda和anaconda 管理环境 包管理 其他 ​ 介绍 Anac ...

  8. debian/ubuntu系统vi无法删除字符的解决办法

    之前在 Linux 下操作,一直使用的是 Centos 系统,使用 vi 编辑命令一直很顺畅. 最近,入手了一台 debian 操作系统的 vps.在操作 vi 命令时,发现当输入 i 要进行文件编辑 ...

  9. linux服务器清理指定日期所有垃圾日志文件

    阿里云服务器推荐购买99元 硬盘再大,也架不住日志文件多. 1.找到并清除30天前的所有日志文件. find / -name "*.log" -mtime +30 -exec rm ...

  10. 使用Redis防止重复发送RabbitMQ消息

    问题 今天遇到一个问题,发送MQ消息的时候需要保证不会重复发送,注意不是可靠到达(可靠到达可以通过消息确认机制和回调接口保证),这里保证的是不会生产多条一样的消息. 方法 综合讨论下来决定使用Redi ...