BZOJ1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草
数轴上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 边跑边吃草的更多相关文章
- 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 ...
- BZOJ 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草( dp )
dp... dp( l , r , k ) , 表示 吃了[ l , r ] 的草 , k = 1 表示最后在 r 处 , k = 0 表示最后在 l 处 . ------------------- ...
- [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 ...
- 【bzoj1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草 区间dp
题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋,它想把它们全部吃 ...
- 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开始吃 ...
- BZOJ1742[Usaco2005 nov]Grazing on the Run
Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...
- 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] ...
- [USACO2005 nov] Grazing on the Run【区间Dp】
Online Judge:bzoj1742,bzoj1694 Label:区间Dp 题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我 ...
- BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁
2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 56 Solved: 16[S ...
随机推荐
- bootstrap CSS表单、按钮和字体图标
基础表单 <form role="form"> <div class="form-group"> <l ...
- hashlib加密模块详解
1.hash是把任意长度的消息压缩到某一固定长度的数值的函数. hash主要用于安全加密,把一些不同长度的信息转化成杂乱的128位编码里,叫做hash值. hash就是把内容和内容地址之间找到一种映射 ...
- 【学习笔记】深入理解js原型和闭包(1)—— 一切都是对象
“一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的运算符——typeof.typeof ...
- ES6学习笔记(11)----Proxy
参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ Proxy1.概述 Proxy可以用来修改对象的默认操作 let obj = {na ...
- eggs
Description: Erin买了不少鸡蛋,她发现一天吃不完这么多,于是决定把n个同样的鸡蛋放在m个同样的篮子里,允许有的篮子空着不放,请问共有多少种不同的放法呢? 注意:2,1,1和1,2,1 ...
- SQL中的笛卡儿积问题和多表连接操作
(使用scott用户) SELECT * FROM scott.dept;--4SELECT * FROM scott.emp;--14 /**笛卡尔积内连接(等值连接)外连接(非等值连接)自连接*/ ...
- (转)Synopsys工具简介
DC Ultra--Design Compiler的最高版本 在Synopsys软件中完整的综合方案的核心是DC UltraTM,对所有设计而言它也是最好级别的综合平台.DC Ultra添加了全面的数 ...
- 深入解析Web Services
SOA,面向服务器建构,是一款架构,这几年虽然没前几年那么流行,但是还是有很多企业在用,而Web Services是目前适合做SOA的主要技术之一,通过使用Web Services,应用程序可以对外发 ...
- MFC限制窗口大小
MFC限制窗口大小 使用:WM_GETMINMAXINFO message void OnGetMinMaxInfo(MINMAXINFO* lpMMI) { lpMMI->ptMinTrack ...
- Spring-01 注解实现IOC
Spring框架四大原则 使用pojo进行轻量级和最小侵入式开发. 通过依赖注入和基于接口编程实现松耦合. 使用AOP和默认习惯进行声明式编程. 使用AOP和模板(template)减少模式化代码. ...