[Baltic2009]beetle【区间Dp】
Online Judge:Bzoj1761
Label:区间Dp
题目描述
在一条直线上有N个点,每个点M升水. 一个虫子在坐标轴0点上,它每个单位时间移动一格,每个点的水每单位时间消失1升. 问虫子最多可以喝到多少水,喝水的时间忽略不计。
输入
第一行给出数字N,M
下面N行给出N个点的坐标Xi
\(0≤n≤300\), \(1≤m≤1,000,000\),$ −10,000 ≤ x1, x2, . . . , xn ≤ 10,000$
输出
最多可以喝到多少水。
样例
Input
3 15
6
-3
1
Output
25
Hint
虫子开始在0点,它先到1这个点喝水,再到-3,再到6.
题解
类似但更为简单的一道题:USACO2005 nov [Grazing on the Run]。
本题题解将基于上面这道的题解来bb,没做过可以先去看这题。
上面那个问题其实求的是:
你的初始坐标为x,你要去数轴上的n个点,每个点原有无限水量。每秒每个点都会少掉一单位水,问遍历完所有点,浪费的最少水量是多少?
而现在我们求的是最多能喝到多少水,而且不一定需要遍历所有点(因为可能你到那了水已经没了,等同于没去遍历)。
假设我们上面那道题求出结果为\(f[1][n]\),难道这道题答案就是\(M*N-f[1][n]\)吗?看起来好像没有问题,似乎是总的水量-浪费的水量,但是,我们上面求出的dp值计算的是所有点的浪费总水量和,但本题中如果我们只考虑去区间\([l,r](l!=1||r!=n)\)则浪费水量会多计了,答案自然不正确。
如何避免这个问题呢?观察数据范围,上面那题\(n<=1000\),而这题\(n<=300\),似乎暗示我们可以再枚举一维:)
我们现在不知道最终走过的区间长度,那就去枚举它,这样我们就可以确定水的总量,从而可以确定每秒浪费的水量(不在我这个区间内的点我就不管它了)。剩下的部分就跟上面那道题一模一样了。
综上,时间复杂度为\(O(N^3)\)。
完整代码如下
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=305,INF=0x3f3f3f3f;
int a[N],dis[N][N],ans,f[N][N][2];
int n,m;
inline void Do(int &x,int y){(x>y)&&(x=y);}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
a[++n]=0;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=abs(a[i]-a[j]);
int st=lower_bound(a+1,a+n+1,0)-a;
for(int tot=1;tot<=n;tot++){//枚举最终走过区间长度
memset(f,0x3f,sizeof(f));
f[st][st][0]=f[st][st][1]=0;//注意每次都要初始化
for(int i=1;i<=tot;i++)for(int l=1;l+i-1<=n;l++){
int r=l+i-1;
if(f[l][r][0]<INF){
if(l!=1)Do(f[l-1][r][0],f[l][r][0]+dis[l-1][l]*(tot-i));
if(r!=n)Do(f[l][r+1][1],f[l][r][0]+dis[l][r+1]*(tot-i));
}
if(f[l][r][1]<INF){
if(l!=1)Do(f[l-1][r][0],f[l][r][1]+dis[r][l-1]*(tot-i));
if(r!=n)Do(f[l][r+1][1],f[l][r][1]+dis[r][r+1]*(tot-i));
}
}
for(int i=1;i+tot-1<=n;i++){//此时喝到水量=(区间总水量-区间浪费水量)
ans=max(ans,(tot-1)*m-min(f[i][i+tot-1][0],f[i][i+tot-1][1]));
}
}
printf("%lld\n",ans);
}
[Baltic2009]beetle【区间Dp】的更多相关文章
- bzoj 1761: [Baltic2009]beetle 区间dp
1761: [Baltic2009]beetle Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 255 Solved: 92[Submit][Statu ...
- 区间DP复习
区间DP复习 (难度排序:(A,B),(F,G,E,D,H,I,K),(C),(J,L)) 这是一个基本全在bzoj上的复习专题 没有什么可以说的,都是一些基本的dp思想 A [BZOJ1996] [ ...
- [USACO2005 nov] Grazing on the Run【区间Dp】
Online Judge:bzoj1742,bzoj1694 Label:区间Dp 题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我 ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
随机推荐
- NX二次开发-UF_MODL_intersect_objects获取两个对象的交点
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...
- pycharm 使用心得(一)安装和首次使用
PyCharm 是我用过的python编辑器中,比较顺手的一个.而且可以跨平台,在macos和windows下面都可以用,这点比较好. 首先预览一下 PyCharm 在实际应用中的界面:(更改了PyC ...
- Java-Class-@I:org.junit.Test
ylbtech-Java-Class-@I:org.junit.Test 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 1. package org.junit; import ...
- BOM DOM 简介
BOM和DOM简介 BOM,Browser Object Model ,浏览器对象模型. BOM主要提供了访问和操作浏览器各组件的方式. 浏览器组件: window(浏览器窗口) locati ...
- 牛客B-Xor Path /// 求所有Path( i->j )( j >= i )路径的异或和
题目大意: https://ac.nowcoder.com/acm/contest/272/B?&headNav=acm 给定一棵n个点的树,每个点有权值.定义表示 到 的最短路径上,所有 ...
- USACO2007 Monthly Expense /// 二分法 oj21658
题目大意: 共N ( 1 ≤ N ≤ 100,000 )个 工作日 ,分M ( 1 ≤ M ≤ N ) 个 清算月 一个 清算月 包含一个工作日或更多连续的工作日,每一个工作日都仅被包含在一个 清算月 ...
- css布局-瀑布流的实现
一.基本思路 1.先看最终的效果图: 2.实现原理:通过position:absolute(绝对定位)来定位每一个元素的位置,并且将当前列的高度记录下来方便下一个dom位置的计算 二.代码实现 1.版 ...
- 关于SQL server2017无法连接远程服务器的问题
安装了SQL server2017,能连接上本地数据库,但是连接远程数据库则老报错,什么实例错误之类的,百度找了也是什么打开sql server 服务,什么修改端口1433,什么TCP协议之类的,全部 ...
- npm 安装vue 报错Failed at the chromedriver@2.46.0 install script 'node install.js'
原因一般是下载源被封了,我们连接淘宝的下载源下载: npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/d ...
- JAVA算法之高级排序
本章介绍两种高级排序,希尔排序和快速排序,这两种排序比之前讲到的简单排序都要快很多:希尔排序大约需要O(N*(logN)2)的时间,快速排序的时间复杂度为(N*logN),这两种算法和我们在讲递归的时 ...