Description

John养了一只叫Joseph的奶牛。一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草。我们可
以认为草地是一个数轴上的一些点。Joseph看到这些草非常兴奋,它想把它们全部吃光。于是它开始左右行走,吃
草。John和Joseph开始的时候站在p位置。Joseph的移动速度是一个单位时间一个单位距离。不幸的是,草如果长
时间不吃,就会腐败。我们定义一堆草的腐败值是从Joseph开始吃草到吃到这堆草的总时间。Joseph可不想吃太腐
败的草,它请John帮它安排一个路线,使得它吃完所有的草后,总腐败值最小。John的数学很烂,她不知道该怎样
做,你能帮她么?

Input

* Line 1 : Two space-separated integers: N and L. N<=1000
* Lines 2..N+1: Each line contains a single integer giving the position P of a clump (1 <= P <= 1,000,000).

Output

* Line 1: A single integer: the minimum total staleness Bessie can achieve while eating all the clumps.

Sample Input

4 10
1
9
11
19
INPUT DETAILS:
Four clumps: at 1, 9, 11, and 19. Bessie starts at location 10.

Sample Output

44
OUTPUT DETAILS:
Bessie can follow this route:
* start at position 10 at time 0
* move to position 9, arriving at time 1
* move to position 11, arriving at time 3
* move to position 19, arriving at time 11
* move to position 1, arriving at time 29
giving her a total staleness of 1+3+11+29 = 44. There are other routes
with the same total staleness, but no route with a smaller one.44
题解:这道题因为牛一直在左右走,所以全部吃完后牛一定停在最左边的那块草地或最右边的那块草地,同样的是,对于区间i草地到j草地来说,当牛吃完这块草地的时候,它一定停在i草地或j草地上,我们用f[i][j][0]表示牛吃完区间i到j,并停在i草地所得的腐烂值,f[i][j][1]表示停在j草地所得的腐烂值。a储存每块草地的位置。
为了后面的计算方便,我们把牛的最初位置也算作一块草地,只不过f[i][i][0]=f[i][i][1]=0,是没有值的。所以n在一开始会加上1。
则动态转移方程为:

f[i][j][0]=min(f[i+1][j][0]+(a[i+1]-a[i])*(n-j+i),f[i+1][j][1]+(a[j]-a[i])*(n-j+i));
   f[i][j][1]=min(f[i][j-1][0]+(a[j]-a[i])*(n-j+i),f[i][j-1][1]+(a[j]-a[j-1])*(n-j+i));

首先我们先看第一个式子 f[i][j][0]=min(f[i+1][j][0]+(a[i+1]-a[i])*(n-j+i),f[i+1][j][1]+(a[j]-a[i])*(n-j+i));

f[i][j][0]表示牛吃完区间i到j,并停在i草地所得的腐烂值,那说明i草地是这块区间内最后被吃的,即在这之前i+1到j块草地已经被吃过了,且牛停在i+1块草地或是j块草地上,

当它之前停在i+1块草地上时,即之前的腐烂值为f[i+1][j][0]时,我们只需在之前的腐烂值上,加上第i+1块草地到第i块草地,所会带来的总腐烂值,就是现在的答案啦。

那么什么是所会带来的总腐烂值呢?当牛从i+1到i时,所需经过的路程为a[i+1]-a[i],即之后吃的每块草地都需加上这个腐烂值,总共有n-j+i(这个值是把牛最初的位置也当成一块草地的前提下推出来的,就是n-(j-i))块草地未被吃,所以之后总共要增加的腐烂值为(a[i+1]-a[i])*(n-j+i),总腐烂值就是f[i+1][j][0]+(a[i+1]-a[i])*(n-j+i),我们再把它和牛之前停在第j块草地上所需增加的腐烂值进行比较,取较小的就是f[i][j][0]的值。

第二个式子也是差不多的,可以自己去推一下。

还有一点,让我错了5次,就是一开始f[i][i][0]和f[i][i][1]是不能全部都算作无限大的,而应该赋值为它与牛初始位置之差并乘上n,即一开始就只吃那块草地所会为其他草地带去的腐烂值。

记得排序!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int n,l,j,a[],f[][][];
int main()
{
cin>>n>>l;
for (int i=;i<=n;i++) cin>>a[i];
a[n+]=l;
n+=;
sort(a+,a++n);
for (int i=;i<=n;i++)
f[i][i][]=f[i][i][]=abs(a[i]-l)*n;//这里的初始化一定要小心!
for (int len=;len<=n;len++)
for (int i=;i<=n-len+;i++)
{
j=i+len-;
f[i][j][]=min(f[i+][j][]+(a[i+]-a[i])*(n-j+i),f[i+][j][]+(a[j]-a[i])*(n-j+i));//吃完i到j这个区间并停在i所获的最小腐烂值
f[i][j][]=min(f[i][j-][]+(a[j]-a[i])*(n-j+i),f[i][j-][]+(a[j]-a[j-])*(n-j+i));//这个是停在j的
//奇怪的方程。。。在前面写过意思了
}
cout<<min(f[][n][],f[][n][])<<endl;//输出最优解。
return ;
}

BZOJ1742[Usaco2005 nov]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. BZOJ1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草

    数轴上n<=1000个点,从p出发以任意顺序走到所有的点,求到达每个点的时间之和的最小值. 好题!看起来水水的实际易错! 显然的结论是经过一个区间点之后肯定落在左端点或右端点上,谁没事最后还往中 ...

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

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

  4. [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 ...

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

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

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

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

  7. bzoj 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草【区间dp】

    挺好的区间dp,状态设计很好玩 一开始按套路设f[i][j],g[i][j]为吃完(i,j)区间站在i/j的最小腐败值,后来发现这样并不能保证最优 实际上是设f[i][j],g[i][j]为从i开始吃 ...

  8. BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁

    2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 56  Solved: 16[S ...

  9. 1741: [Usaco2005 nov]Asteroids 穿越小行星群

    1741: [Usaco2005 nov]Asteroids 穿越小行星群 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 231  Solved: 166 ...

随机推荐

  1. RabbitMQ的work queue(2)

    课堂上work queue没能很好的理解,看了大神的博客,顿觉醍醐灌顶,豁然开朗. work queue有两种模式: 平均分配:(默认)//channel.basicQos(1);即把 同一时刻服务器 ...

  2. 15.8.6 AUTO_INCREMENT Handling in InnoDB

    1 传统模式 innodb_autoinc_lock_mode (“traditional” lock mode) 2 连续模式 innodb_autoinc_lock_mode (“consecut ...

  3. 使用myeclipse为java web项目添加SSH框架

    添加SSH框架时,要严格按照先Struts,再Spring,最后Hibernate.添加方法见下方: 第一步:添加Struts框架 请按照图示一步步认真执行,配置好struts才可以进行下一步 第二步 ...

  4. CSS3学习内容与心得

    今天2005年7月9号,博客这个东西还真不懂,以前吧我不认识它,它也不认识我.没辙,汤老要我们写,就写吧. 写什么好呢?那就写今天学习的css3的一些要点吧. css这门课程几乎都学完了.而我觉得我还 ...

  5. RapidXML 试用

    近半年来断断续续的封装一些SDK,在兼顾跨平台.易用性和高效率上还要顾及到对外dll的大小问题.由于之前解析SVG文件的用到了一个XML解析库xercesc,这个DLL实在巨大近4M,于是尝试用新的X ...

  6. tomcat配置性能调优1----server.xml文件详解

    <?xml version='1.0' encoding='utf-8'?><!--  Licensed to the Apache Software Foundation (ASF ...

  7. go 静态web服务器

    package main import ( "net/http" ) type helloHandler struct{} func (h *helloHandler) Serve ...

  8. navigator对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. eclipse maven spring mvc el表达式无效

    http://www.myexception.cn/javascript/2031310.html

  10. Aspen 安装

    按原安装后破解不成功后: 从下载文件夹中,找到 AspenONEV8.\Patch\-STRGXI2.zip,里面有个 STRGXI2.dll,将该文 件复制到: C:\Program Files(x ...