【题目大意】

大致题意就是,你的初始坐标为\(x\),你要去数轴上的\(n\)个点,问你到达所有点的时间总和最小是多少。

直接贪心肯定不行,所以考虑\(DP\)

先把坐标离散(也就是预处理两点距离\(dis[i][j]=abs(a[i]−a[j])\))

接下来考虑如何dp。

关注到一个性质,如果到目前为止,奶牛吃过最左的草堆编号为\(l\),吃过最右的草堆编号为\(r\),则如果奶牛不是傻它肯定把\([l,r]\)的草堆都吃过了,因为它吃草速度是瞬时的,都经过了肯定要嫖一口。

那很明显应该是个区间dp了。

不难定义出状态\(f[0/1][i][j]\)表示已经吃完\([i,j]\)的草了,且现在在左端\(i(0)\),在右端\(j(1)\),所需的最少时间和。

转移根据意义模拟一下就好了,假如我现在从区间的某端\(k\)转移到某点\(l\),则花去时间为\(dis[k][l]\),在这个时间内除了区间\([i,j]\),其他所有草堆的腐败值都增加了\(1\)。

具体转移顺序可以打个记搜。也可以直接循环转移——枚举区间长度,再枚举左端点。然后对于这道题内部再分类讨论一下处于左右端位置即可。时间复杂度为\(O(N^2)\)。

#include <bits/stdc++.h>
using namespace std ;
const int N = 1005 , INF = 0x3f3f3f3f ;
int n , s , st ;
int p[ N ] ;
int f[ N ][ N ][ 2 ] ;
int dis[ N ][ N ] ;
signed main () {
scanf ( "%d%d" , &n , &s ) ;
for ( int i = 1 ; i <= n ; i ++ ) scanf ( "%d" , &p[ i ] ) ;
p[ ++ n ] = s ;
sort ( p + 1 , p + 1 + n ) ;
for ( int i = 1 ; i <= n ; i ++ )
for ( int j = 1 ; j <= n ; j ++ )
dis[ i ][ j ] = dis[ j ][ i ] = abs ( p[ i ] - p[ j ] ) ;
st = lower_bound ( p + 1 , p + 1 + n , s ) - p ;
memset ( f , 0x3f , sizeof ( f ) ) ;
f[ st ][ st ][ 0 ] = f[ st ][ st ][ 1 ] = 0 ;
for ( int i = 1 ; i <= n ; i ++ ) {
for ( int l = 1 ; l + i - 1 <= n ; l ++ ) {
int r = i + l - 1 ;
if ( f[ l ][ r ][ 0 ] < INF ) {
if ( l > 1 ) f[ l - 1 ][ r ][ 0 ] = min ( f[ l - 1 ][ r ][ 0 ] , f[ l ][ r ][ 0 ] + dis[ l ][ l - 1 ] * ( n - i ) ) ;
if ( r < n ) f[ l ][ r + 1 ][ 1 ] = min ( f[ l ][ r + 1 ][ 1 ] , f[ l ][ r ][ 0 ] + dis[ l ][ r + 1 ] * ( n - i ) ) ;
}
if ( f[ l ][ r ][ 1 ] < INF ) {
if ( r < n ) f[ l ][ r + 1 ][ 1 ] = min ( f[ l ][ r + 1 ][ 1 ] , f[ l ][ r ][ 1 ] + dis[ r ][ r + 1 ] * ( n - i ) ) ;
if ( l > 1 ) f[ l - 1 ][ r ][ 0 ] = min ( f[ l - 1 ][ r ][ 0 ] , f[ l ][ r ][ 1 ] + dis[ r ][ l - 1 ] * ( n - i ) ) ;
}
}
}
printf ( "%d\n" , min ( f[ 1 ][ n ][ 0 ] , f[ 1 ][ n ][ 1 ] ) ) ;
return 0 ;
}

Grazing on the Run 题解的更多相关文章

  1. bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草*&&bzoj3074[Usaco2013 Mar]The Cow Run*

    bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草 bzoj3074[Usaco2013 Mar]The Cow Run 题意: 数轴上有n棵草,牛初始在L ...

  2. BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )

    dp... dp( l , r , k )  , 表示 吃了[ l , r ] 的草 , k = 1 表示最后在 r 处 , k = 0 表示最后在 l 处 . ------------------- ...

  3. BZOJ1742[Usaco2005 nov]Grazing on the Run

    Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...

  4. 【bzoj1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草 区间dp

    题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋,它想把它们全部吃 ...

  5. [USACO2005 nov] Grazing on the Run【区间Dp】

    Online Judge:bzoj1742,bzoj1694 Label:区间Dp 题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我 ...

  6. F. Mattress Run 题解

    F. Mattress Run 挺好的一道题,对于DP的本质的理解有很大的帮助. 首先要想到的就是将这个拆成两个题,一个dp光求获得足够的夜晚的最小代价,一个dp光求获得足够的停留的最小代价. 显然由 ...

  7. [Usaco2005 nov]Grazing on the Run 边跑边吃草 BZOJ1742

    分析: 首先,连续选择一段必定最优... 区间DP,f[i][j]表示从i开始,连续j个被吃掉了,并且,牛在i处,g[i][j]则表示在i+j-1处 f[i][j]可以从g[i+1][j]和f[i+1 ...

  8. poj 3042 Grazing on the Run

    这个题目原型应该是吃完所有的草丛的最小时间,现在变成了每个草丛被吃的时间和,貌似如果还是按照原来的dp方法dp[i][j]表示吃完i到j的草丛的花掉的时间的话,有两个因素会影响后面的决策,一个是花掉的 ...

  9. 2018.10.22 bzoj1742: Grazing on the Run 边跑边吃草(区间dp)

    传送门 区间dp入门题. 可以想到当前吃掉的草一定是一个区间(因为经过的草一定会吃掉). 然后最后一定会停在左端点或者右端点. f[i][j][0/1]f[i][j][0/1]f[i][j][0/1] ...

随机推荐

  1. JAVA 面向对象 三大特征:继承

    什么是继承 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接访 ...

  2. 雨云CDN - 好用的CDN服务

    注册雨云 点我 创建CDN     解析CDN 解析完后去试试快了吗?

  3. 3.TCP协议

    一.TCP协议特点和报文段格式 面向连接的传输层协议 每一条TCP连接只能有两个端点 TCP提供可靠交付的服务,无差错,不丢失,不重复,按序到达 全双工通信 -> 发送缓冲:准备发送的数据&am ...

  4. abp vnext 开发快速入门 2 实现基本增删改查

    上篇说了abp vnext 的大体框架结构,本篇说下如何实现基础的增删改查.实现增删改查有以下几个步骤: 1.配置数据库连接 2.领域层(Domain)创建实体,Ef core 层配置Dbset( 用 ...

  5. 题解 洛谷 P3185 【[HNOI2007]分裂游戏】

    首先可以发现,当所有巧克力豆在最后一个瓶子中时,就无法再操作了,此时为必败状态. 注意到,对于每个瓶子里的巧克力豆,是可以在模\(2\)的意义下去考虑的,因为后手可以模仿先手的操作,所以就将巧克力豆个 ...

  6. 循序渐进nginx(二):反向代理、负载均衡、缓存服务、静态资源访问

    目录 反向代理 使用 1.创建代理目标服务端: 2.配置nginx反向代理目标服务端: 3.测试使用: 负载均衡 使用 1.准备服务端 2.修改nginx配置 3.测试 负载均衡策略 负载均衡的额外参 ...

  7. js的传递方式

    回头过来复习一下. 从一个变量向另一个变量复制的时候,复制过去以后,都是单独独立的变量,当你改变其中一个的时候,并不会影响另一个变量.他们只是value相同而已: var a = 1; var b= ...

  8. leetcode题库练习_数组中重复的数字

    题目:数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次 ...

  9. git问题解决

    1.如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候, 在发布这个配置文件的时候,会发生代码冲突: error: Your local changes to the ...

  10. 集合和Iterator迭代器

    集合 集合是java中提供的一种容器,可以用来存储多个数据. 注意: ①.集合只能存放对象.比如你存一个 int 型数据 1放入集合中, 其实它是自动转换成 Integer 类后存入的,Java中每一 ...