能量消耗:一个前缀和优化 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. Cygwin:windows下的Linux系统

    Cygwin是啥?Cygwin是一个可原生运行于Windows系统上的POSXI兼容环境. 是的,我又开新专辑了<零基础swoole学习笔记>.不是我太贪心,而是最近半年和小伙伴一直在用s ...

  2. Jenkins篇-安装与使用

    Jenkins是一个开源自动化服务器,可以自动执行持续集成和交付软件所涉及的重复技术任务.Jenkins是基于Java的,可以从Ubuntu软件包安装,也可以通过下载和运行其Web应用程序存档(WAR ...

  3. java集合【10】——— LinkedList源码解析

    1.LinkedList介绍 我们除了最最常用的ArrayList之外,还有LinkedList,这到底是什么东西?从LinkedList官方文档,我们可以了解到,它其实是实现了List和Queue的 ...

  4. git 推送代码到多个 远端仓库

    业务场景 在开发代码时,有时希望将代码推送到两个远端仓库. 实现方法 git remote add origin giturl1 git remote add backup giturl2 git p ...

  5. ORCA避障源码笔记

    参考资料 https://gamma.cs.unc.edu/ORCA/publications/ORCA.pdf https://gamma.cs.unc.edu/RVO2/ 数学知识 1.向量的点乘 ...

  6. 《JavaScript 模式》读书笔记(5)— 对象创建模式3

    这一篇,我们主要来学习了解下沙箱模式以及静态成员的相关内容. 五.沙箱模式 沙箱模式(sandbox pattern)解决了命名空间模式的如下几个缺点: 对单个全局变量的依赖变成了对应用程序的全局变量 ...

  7. SQLServer无法远程连接的解决方法

    ​服务器端: 打开SQLServer配置管理器 - SQLServer 网络配置- MSSQLSERVER的协议-TCP/IP 启用 运行输入Services.msc,重启MSSQLSERVER服务. ...

  8. 【PHP】读取本地文件夹中所有图片并显示

    <? //获取文件夹下的所有文件 $dir_str = ''; $imgType = array('gif','png','jpg','jpeg','bmp'); $handle = opend ...

  9. 【转载】获取Java接口的所有实现类

    https://www.cnblogs.com/wangzhen-fly/p/11002814.html 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探 ...

  10. 谈谈区块链(18):以太坊的UTXO

    https://www.8btc.com/article/117510 本来并没有计划写这篇文章,只是这两天微信里有一篇文章传播的比较厉害,叫:<其实并没有什么比特币,只有UTXO>.其中 ...