数轴上n<=1000个点,从p出发以任意顺序走到所有的点,求到达每个点的时间之和的最小值。

好题!看起来水水的实际易错!

显然的结论是经过一个区间点之后肯定落在左端点或右端点上,谁没事最后还往中间跑呢!那就可以拍个序然后设计dp状态了,一个区间dp,f[i,j,0/1]表示走了区间i~j,最后落在左/右端点。

一个小技巧是把p算成一个点,初始化时之后p这个状态为0,其他都inf。那么问题来了!

方法一:记到状态的时间t[i,j,0/1],那么,相应更新t,其他同理。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n,p;
#define maxn 1011
int a[maxn],f[maxn][maxn][],t[maxn][maxn][];
const int inf=0x3f3f3f3f;
int min(int a,int b) {return a<b?a:b;}
int main()
{
scanf("%d%d",&n,&p);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a++n);
for (int i=;i<=n;i++) f[i][i][]=f[i][i][]=t[i][i][]=t[i][i][]=inf;
a[n+]=inf;int pos;
for (pos=;pos<=n+;pos++) if (a[pos]>p) break;
if (pos==n+) t[n][n][]=t[n][n][]=f[n][n][]=f[n][n][]=p-a[n];
else if (pos==) t[][][]=t[][][]=f[][][]=f[][][]=a[]-p;
else f[pos][pos][]=f[pos][pos][]=a[pos]-p,f[pos-][pos-][]=f[pos-][pos-][]=p-a[pos-],
t[pos][pos][]=t[pos][pos][]=a[pos]-p,t[pos-][pos-][]=t[pos-][pos-][]=p-a[pos-];
for (int len=;len<n;len++)
for (int i=;i<=n-len;i++)
{
const int j=i+len;
if (f[i+][j][]+t[i+][j][]+a[i+]-a[i]<f[i+][j][]+t[i+][j][]+a[j]-a[i])
{
t[i][j][]=t[i+][j][]+a[i+]-a[i];
f[i][j][]=f[i+][j][]+t[i][j][];
}
else
{
t[i][j][]=t[i+][j][]+a[j]-a[i];
f[i][j][]=f[i+][j][]+t[i][j][];
}
if (f[i][j-][]+t[i][j-][]+a[j]-a[i]<f[i][j-][]+t[i][j-][]+a[j]-a[j-])
{
t[i][j][]=t[i][j-][]+a[j]-a[i];
f[i][j][]=f[i][j-][]+t[i][j][];
}
else
{
t[i][j][]=t[i][j-][]+a[j]-a[j-];
f[i][j][]=f[i][j-][]+t[i][j][];
}
f[i][j][]=min(f[i][j][],inf);
f[i][j][]=min(f[i][j][],inf);
}
printf("%d\n",min(f[][n][],f[][n][]));
return ;
}

错误!递推式不成立,没有考虑当前决策对后续状态的影响。错误样例?自己找个标程对拍吧!

方法二:直接把状态对后面的影响算出来,,保证了无后效性。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n,p;
#define maxn 1011
int a[maxn],f[maxn][maxn][];
const int inf=0x3f3f3f3f;
int min(int a,int b) {return a<b?a:b;}
int main()
{
scanf("%d%d",&n,&p);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
a[++n]=p;
sort(a+,a++n);
for (int i=;i<=n;i++)
{
if (a[i]!=p) f[i][i][]=f[i][i][]=inf;
else f[i][i][]=f[i][i][]=;
}
for (int len=;len<n;len++)
for (int i=;i<=n-len;i++)
{
const int j=i+len;
f[i][j][]=min(inf,min(f[i+][j][]+(n-j+i)*(a[i+]-a[i]),f[i+][j][]+(n-j+i)*(a[j]-a[i])));
f[i][j][]=min(inf,min(f[i][j-][]+(n-j+i)*(a[j]-a[i]),f[i][j-][]+(n-j+i)*(a[j]-a[j-])));
}
printf("%d\n",min(f[][n][],f[][n][]));
return ;
}

此题在九月份错过一次。

BZOJ1694一样哦!然而又错了,一看原题一激动忘排序了。

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. BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )

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

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

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

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

  5. 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开始吃 ...

  6. BZOJ1742[Usaco2005 nov]Grazing on the Run

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

  7. 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] ...

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

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

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

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

随机推荐

  1. codevs 1422 河城荷取

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有 ...

  2. Devops 技术图谱

  3. 聊天室(C++客户端+Pyhton服务器)3.群功能添加

    创建群 数据库 group_table(user, name) grpuser_table(grpname,user) 按下添加群按钮 // 创建群组void CUserDialog::OnBnCli ...

  4. uva10735 Euler Circuit

    题外话:很多混合图问题可以转化为有向图问题(将无向边拆为两条有向边) 本题不行,因为只能经过一次 这种问题能想到网络流.. 复习欧拉回路:入度==出度 和uva1380有点相似,要先给无向边定向.原图 ...

  5. Hbase数据库简介

    Hbase是基于Hadoop下分布式存储 数据库,列式存储.(https://www.imooc.com/video/17202) 动态的增加列,不像关系数据库需要提前定义好列. 关系数据库     ...

  6. PHP14 动态图像处理

    学习要点 如何使用PHP中的GD库 设计验证码类 PHP图片处理 设计图像图处理类 如何使用PHP中的GD库 在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或者对网站 ...

  7. 性能测试,如何得到大量token,并保存在本地文件中

    需求:性能测试需要大量的token,模拟登陆 设计思路: 1.使用语言:python +request+正则匹配+写入本地 2.jmeter+函数助手+正则或者json/yaml+后置处理器beans ...

  8. 【分享】 封装js操作textarea 方法集合(兼容很好)。

    请使用下面的btn操作. 虽然你现在看来没什么用,当要用的时候又到处找资料,还不如现在收集一下.         在DOM里面操作textarea里面的字符,是比较麻烦的. 于是我有这个封装分享给大家 ...

  9. Swift中Singleton的实现

    一.意图 保证一个类公有一个实例,并提供一个访问它的全局访问点. 二.使用场景 1.使用场景 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 当这个唯一实例应该是通过子类化可扩展的,并且 ...

  10. 暴力破解UltraEdit

    使用x32dbg(x64dbg)做为破解工具: 使用x64dbg 打开 udeit64.exe 点击运行,直到UltraEdit启动,转到符号页: 找到: CheckForUpdatesNoPromp ...