bzoj 1761: [Baltic2009]beetle 区间dp
1761: [Baltic2009]beetle
Time Limit: 4 Sec Memory Limit: 64 MB
Submit: 255 Solved: 92
[Submit][Status][Discuss]
Description
一个虫子在坐标轴0点上,它每个单位时间移动一格,每个点的水每单位时间消失1升.
问虫子最多可以喝到多少水,喝水的时间忽略不计
Input
下面N行给出N个点的坐标Xi
0 ≤ n ≤ 300, 1 ≤ m ≤ 1,000,000, −10,000 ≤ x1, x2, . . . , xn ≤ 10,000,
Output
Sample Input
6
-3
1
Sample Output
HINT
虫子开始在0点,它先到1这个点喝水,再到-3,再到6.
走一步产生的损失等于剩下没有喝的位置总数,则另f[x][y][p]表示左端点x,右端点y,当前在x/y位置,最小损失为多少,转移的时候为了处理水量不能减成负数的问题,需要在枚举最终要喝多少个位置。
4s O(n^3)有一点常数问题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 310
#define INFL 0x3f3f3f3f3f3f3f3fLL
typedef long long qword;
int a[MAXN];
qword dp[MAXN][MAXN][];
qword dis[MAXN][MAXN];
inline void deal(qword &x,qword y)
{
x=min(x,y);
} int main()
{
freopen("input.txt","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
for (int i=;i<n;i++)
scanf("%d",a+i);
a[n++]=;
qword ans=-INFL;
sort(a,a+n);
for (int i=;i<n;i++)
for (int j=;j<n;j++)
dis[i][j]=abs(a[i]-a[j]);
int x=lower_bound(a,a+n,)-a;
for (register int tot=;tot<=n;tot++)
{
memset(dp,0x3f,sizeof(dp));
dp[x][x][]=;
for (register int i=;i<=tot;i++)
{
for (register int j=;j+i-<n;j++)
{
if (dp[j][j+i-][]<INFL)
{
if (j)
deal(dp[j-][j-+(i+)-][],dp[j][j+i-][]+dis[j][j-]*(tot-i));
if (j+i-<n-)
deal(dp[j][j+(i+)-][],dp[j][j+i-][]+dis[j][j+(i+)-]*(tot-i));
}
if (dp[j][j+i-][]<INFL)
{
if (j)
deal(dp[j-][j-+(i+)-][],dp[j][j+i-][]+dis[j+i-][j-]*(tot-i));
if (j+i-<n-)
deal(dp[j][j+(i+)-][],dp[j][j+i-][]+dis[j+i-][j+(i+)-]*(tot-i));
}
}
}
for (int j=;j+tot-<n;j++)
{
ans=max(ans,(qword)m*(tot-)-min(dp[j][j+tot-][],dp[j][j+tot-][]));
}
}
printf("%lld\n",ans);
}
bzoj 1761: [Baltic2009]beetle 区间dp的更多相关文章
- BZOJ 1260&UVa 4394 区间DP
题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...
- BZOJ 2933([Poi1999]地图-区间Dp)
2933: [Poi1999]地图 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 7 Solved: 7 [ Submit][ Status] ...
- BZOJ 1055 玩具取名(区间DP)
很显然的区间DP,定义dp[i][j][k], 如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符. # include <cstdio> # include <cst ...
- bzoj 1068 [SCOI2007]压缩 区间dp
[SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1644 Solved: 1042[Submit][Status][Discu ...
- BZOJ 2121: 字符串游戏 区间DP + 思维
Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...
- bzoj 1003物流运输 区间dp+spfa
基本思路: 一开始确实没什么思路,因为觉得怎么着都会超时,然后看一下数据范围,呵,怎么都不会超时. 思路: 1.看到能改变线路,想到可以用以下区间dp,区间dp的话,先枚举长度,枚举开始位置,然后枚举 ...
- bzoj 1564 [NOI2009]二叉查找树 区间DP
[NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 906 Solved: 630[Submit][Status][Discu ...
- BZOJ 1090 字符串折叠(区间DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1090 题意:字符串AAAAAAAAAABABABCCD的最短折叠为9(A)3(AB)CC ...
- BZOJ 2298 problem a(区间DP)
题意:一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) 思路:考虑最多有多少人说真,那么答案就是n-max. ai个人分数 ...
随机推荐
- .Net设计模式_原型模式
引言: 原型,感觉就是拷贝,只是给拷贝分了深拷贝和浅拷贝. 理解: 在C#.Net里面,我们可以很容易的通过Clone()方法实现原型模式. 任何类,只要想支持克隆,必须实现C#中的ICloneabl ...
- 20160314 Servlet 入门
一.Servlet 1.sun提供的一种动态web资源开发技术.本质上就是一段java小程序.可以将Servlet加入到Servlet容器中运行. *Servlet容器 -- 能够运行Servlet的 ...
- 了解JavaScript的执行上下文
转自http://www.cnblogs.com/yanhaijing/p/3685310.html 什么是执行上下文? 当JavaScript代码运行,执行环境非常重要,有下面几种不同的情况: 全局 ...
- Java中到底有没有指针;同时注意引用和指针的区别
Java中引用的作用类似于指针,但是有区别:() (1) 指针必然指向一个内存地址,如果你定义的时候不指定,就会乱指(很可能造成安全隐患)但是引用定义出来后默认指向为空. (2) 指针可 ...
- ORA-12011+ORA-06512–job执行失败问题
oracle库中的一个job,正常运行了一年多,因某种原因导致无法运行,系统尝试多次均失败之后下次执行时间就变成了 4000/1/1. 现导致job失败的问题已经解决,从新运行job时报 12011和 ...
- Java——有关日期的方法
1.日期转换成String格式化输出: public String getDate() { SimpleDateFormat format = new SimpleDateFormat("y ...
- No application 'meetme' for extension 错误
在asterisk中搭建简单会议室,在extensions.conf中执行到 exten => 18,n,MeetMe(18,p) asterisk控制台提示:Aug 6 8:28:41 WAR ...
- JSP EL表达式详细介绍
一.JSP EL语言定义 E L(Expression Language) 目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...
- Java 的自动装箱拆箱
Java 是面向对象的语言,其基本数据类型也就有了相对应的类,称为包装类.以下是基本数据类型对应的包装类: 基本数据类型 包装类 byte(1字节) Byte short(2字节) Short int ...
- DAG模型——硬币问题
硬币问题 有n种硬币,面值分别为V1,V2,...,Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值.1<=n<=100, 0& ...