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

费用提前计算的DP..

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 #define INF 0x3f3f3f3f
 7 #define MAXN 1005
 8 int dp[2][MAXN][MAXN];
 9 int x[MAXN];
10 int n,x0;
11 int main()
12 {
13     scanf("%d%d",&n,&x0);
14     for(int i=1;i<=n;i++)
15         scanf("%d",&x[i]);
16     x[++n]=x0;
17     sort(x+1,x+n+1);
18     for(int i=1;i<=n;i++)
19         if(x[i]!=x0)dp[0][i][i]=dp[1][i][i]=INF;
20         else
21             dp[0][i][i]=dp[1][i][i]=0;
22     for(int i=n;i>=1;i--)
23         for(int j=i+1;j<=n;j++)
24         {
25             dp[0][i][j]=min(dp[0][i+1][j]+(x[i+1]-x[i])*(n-j+i),
26                             dp[1][i+1][j]+(x[j]-x[i])*(n-j+i));
27             dp[1][i][j]=min(dp[1][i][j-1]+(x[j]-x[j-1])*(n-j+i),
28                             dp[0][i][j-1]+(x[j]-x[i])*(n-j+i));
29         }
30         printf("%d\n",min(dp[0][1][n],dp[1][1][n]));
31         return 0;
32 }

时间: 2024-10-12 13:41:34

BZOJ1742[Usaco2005 nov]Grazing on the Run 边跑边吃草的相关文章

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

bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草 bzoj3074[Usaco2013 Mar]The Cow Run 题意: 数轴上有n棵草,牛初始在L位置(bzoj3074的牛初始在1位置),每移动一个单位需要+1s.而每过1s没吃的草腐败度会+1,问吃完所有草的最小腐败度.n≤1000. 题解: 很神的dp.f[l][r][0/1]表示从第l棵草吃到第r棵草,之后到达l/r.则 f[l][r][0]=min(dfs(l+1,r,0)+(n-r+

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

dp... -------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i ) #define clr( x , c ) memset( x ,

BZOJ 1742 Usaco2005 nov Grazing on the Run 边跑边吃草 动态规划

题目大意:给定一个数轴,初始在位置p,有n坨草(n≤3000),约瑟芬需要吃掉所有的草,定义一坨草的腐败值为吃掉的时间,求最小腐败值之和 容易证明任何时刻约瑟芬吃掉的草都是一个区间.(废话,难道还能路过草不吃?) 因此令fi,j,k表示已经吃掉了以i开头的j坨草,当前在左端点/右端点的最小腐败值之和(包括被吃掉的和未被吃掉的,当然被吃掉的腐败值就不会再涨了) DP方程自己YY吧 注意内存 #include <cstdio> #include <cstring> #include &

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开始吃j个,站在这段区间的左/右端点的 * 最小所有草增加的腐败值 * ,因为这些腐败之最后也是要算进去的,所以直接夹在里面就可以保证最优 #include<iostream> #include<cstdio> #include<cstring> #include<algo

bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁*&amp;&amp;bzoj1630[Usaco2007 Demo]Ant Counting*

bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁&&bzoj1630[Usaco2007 Demo]Ant Counting 题意: t个族群,每个族群有ni只蚂蚁,同族群蚂蚁没有区别.问从所有蚂蚁中选出s到b只蚂蚁有多少方案.t≤1000,ni≤100. 题解: dp,f[i][j]表示考虑第i个族群,剩下j只蚂蚁没选择.则f[i][j]=sum(f[i-1][j-k]),k=0..min(j,n[i]).然而O(n^3)会超时,注意到可以计算f[i-1][

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

1741: [Usaco2005 nov]Asteroids 穿越小行星群 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 231  Solved: 166[Submit][Status][Discuss] Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N

BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁

2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 56  Solved: 16[Submit][Status] Description 有一天,贝茜无聊地坐在蚂蚁洞前看蚂蚁们进进出出地搬运食物.很快贝茜发现有些蚂蚁长得几乎一模一样,于是她认为那些蚂蚁是兄弟,也就是说它们是同一个家族里的成员.她也发现整个蚂蚁群里有时只有一只出来觅食,有时是几只,有时干脆整个蚁群一起出来.这样一来,

POJ 3042 Grazing on the Run (区间DP)

区间dp,~~~~ dp[i][j][0]表示i到j之间已经走过,并且现在在i点的staleness(可以理解为枯萎指数)最小值, dp[i][j][1]表示i到j之间已经走过,并且现在在j点的staleness最小值. 于是对于在i点,可能从i+1->i,也可能从j->i,即: 很重要的一点,在我们转移到i时,除了即将到达的i点,还有未到达的(n-(j-i+1))个点,即总共(n-(j-i))个点,它们的枯萎指数均在增加,so~ dp[i][j][0]=min(dp[i+1][j][0]+(

1630/2023: [Usaco2005 Nov]Ant Counting 数蚂蚁

2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 85  Solved: 40[Submit][Status][Discuss] Description 有一天,贝茜无聊地坐在蚂蚁洞前看蚂蚁们进进出出地搬运食物.很快贝茜发现有些蚂蚁长得几乎一模一样,于是她认为那些蚂蚁是兄弟,也就是说它们是同一个家族里的成员.她也发现整个蚂蚁群里有时只有一只出来觅食,有时是几只,有时干脆整个蚁群一