能量消耗:一个前缀和优化 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. 全球气象数据ERA5的下载方法

      本文介绍在ERA5气象数据的官方网站中,手动下载.Python代码自动批量下载逐小时.逐日与逐月的ERA5气象数据各类产品的快捷方法.   ERA5(fifth generation ECMWF ...

  2. pyc文件花指令

    pyc花指令 常见的python花指令形式有两种:单重叠指令和多重叠指令. 以下以python3.8为例,指令长度为2字节. 单重叠指令: 例如pyc经过反编译后得到的东西为 0 JUMP_ABSOL ...

  3. seldom-platform:颠覆传统的自动化测试平台

    seldom-platform:颠覆传统的自动化测试平台 seldom-platform是一个自动化测试平台,其特点是让会写代码的测试人员能够通过seldom框架高效地完成自动化用例的编写,并将剩下的 ...

  4. ng-alain: i18n

    https://github.com/ng-alain/delon/blob/master/packages/theme/src/services/i18n/i18n.ts interface Ala ...

  5. 【Python】【MySQL】Python将JSON数据以文本形式存放到MySQL的Text类型字段中

    1.起因 在做一个自动打卡的玩意.登录会得到那个平台一系列的信息.我又不想专门修改.增加数据库字段来存放,所有打算直接将返回的JSON数据保存到一个MySQL字段中. 内容肯定不能直接放,考虑下比如数 ...

  6. jsch文件复制(拷贝)

    public void copyFile(Session session, String sourceFile, String destinationFile) { ChannelExec chann ...

  7. 【转载】 Locust 官方文档

    链接:https://www.jianshu.com/p/40102e9a24cb 安装 一般直接通过 pip 就可以安装: $ pip install locust 注意: Locust 1.x 版 ...

  8. JDBC核心6步

    1JDBC简介 java DataBase Connectivity,又称java数据库连接 是独立于任何数据库管理系统的api java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现封 ...

  9. Qt音视频开发12-easyplayer内核

    一.前言 在视频监控行业经常看到两个厂家广告打得比较厉害,一个是青犀视频对应easyplayer,一个是大牛直播,两个最初都是sdk免费,并提供调用示例源码,后面大牛直播的sdk以及示例都无法运行,目 ...

  10. Qt开发经验小技巧161-165

    经常有人说Qt垃圾,说用Qt在1毫秒绘制几千个数据点卡成屎.其实显示器最高刷新频率一般才60帧,1毫秒就绘制一次有意义吗?不仅显示器没刷新过来,人肉眼也看不过来(有人可能又要抬杠说这是老板要求的,显示 ...