【BZOJ1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草【区间DP】

原创 2016年06月01日 17:46:41

【题目链接】

算是比较经典的区间DP,比较重要的思路是,把未来的花费放到现在计算。

一开始写了个空间O(n^2)的记忆化搜索,结果被卡内存了,最后换成循环了...

/* Forgive me Not */
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 3001, inf = 0x3f3f3f3f;

int n, s, pos[maxn], dp[maxn][2][2];

inline int iread() {
	int f = 1, x = 0; char ch = getchar();
	for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
	return f * x;
}

int main() {
	n = iread(); s = iread();
	for(int i = 1; i <= n; i++) pos[i] = iread();
	pos[++n] = s;
	sort(pos + 1, pos + 1 + n);
	s = lower_bound(pos + 1, pos + 1 + n, s) - pos;

	for(int i = 1; i <= n; i++) dp[i][1][0] = dp[i][1][1] = inf;
	dp[s][1][0] = dp[s][1][1] = 0;
	for(int i = 2; i <= n; i++) for(int l = 1; l <= n - i + 1; l++) {
		int r = l + i - 1;
		dp[l][i & 1][1] = min(dp[l + 1][~i & 1][1] + (n - i + 1) * (pos[l + 1] - pos[l]), dp[l + 1][~i & 1][0] + (n - i + 1) * (pos[r] - pos[l]));
		dp[l][i & 1][0] = min(dp[l][~i & 1][0] + (n - i + 1) * (pos[r] - pos[r - 1]), dp[l][~i & 1][1] + (n - i + 1) * (pos[r] - pos[l]));
	}
	printf("%d\n", min(dp[1][n & 1][0], dp[1][n & 1][1]));
	return 0;
}

记忆化搜索:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 3001, inf = 0x3f3f3f3f;

int n, s, pos[maxn], dp[maxn][maxn][2];

inline int iread() {
	int f = 1, x = 0; char ch = getchar();
	for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
	return f * x;
}

inline int iabs(int x) {
	return x < 0 ? -x : x;
}

inline int dfs(int l, int r, bool left) {
	if(l == r) return l == s ? 0 : inf;
	if(~dp[l][r][left]) return dp[l][r][left];
	int res = 0;
	if(left) res = min(dfs(l + 1, r, 1) + (n - r + l) * iabs(pos[l + 1] - pos[l]), dfs(l + 1, r, 0) + (n - r + l) * iabs(pos[r] - pos[l]));
	else res = min(dfs(l, r - 1, 0) + (n - r + l) * iabs(pos[r] - pos[r - 1]), dfs(l, r - 1, 1) + (n - r + l) * iabs(pos[r] - pos[l]));
	return dp[l][r][left] = res;
}

int main() {
	n = iread(); s = iread();
	for(int i = 1; i <= n; i++) pos[i] = iread();
	pos[++n] = s;
	sort(pos + 1, pos + 1 + n);
	s = lower_bound(pos + 1, pos + 1 + n, s) - pos;
	memset(dp, -1, sizeof(dp));
	printf("%d\n", min(dfs(1, n, 0), dfs(1, n, 1)));
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

【bzoj1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草

DescriptionJohn养了一只叫Joseph的奶牛。一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草。我们可 以认为草地是一个数轴上的一些点。Joseph看到这些草非常兴奋,...
  • w_yqts
  • w_yqts
  • 2017年07月26日 16:13
  • 127

【BZOJ1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草【区间DP】

【题目链接】 算是比较经典的区间DP,比较重要的思路是,把未来的花费放到现在计算。 一开始写了个空间O(n^2)的记忆化搜索,结果被卡内存了,最后换成循环了... /* Forgive ...
  • BraketBN
  • BraketBN
  • 2016年06月01日 17:46
  • 415

【bzoj1133】[POI2009]Kon

Description火车沿途有N个车站,告诉你从每一站到每一站的人数,现在查票员只能查K次票,每次查票可以控制目前在车上的所有乘客的车票。求一个查票方案,使得控制的不同的乘客尽量多。 (显然对同一个...
  • w_yqts
  • w_yqts
  • 2017年07月26日 15:14
  • 87

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

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

[Usaco2005 Nov Gold]Grazing on the Run奶牛吃草-Dp 移动类

Description John养了一只叫Joseph的奶牛。一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草。我们可以认为草地是一个数轴上的一些点。Joseph看到这些草非常兴奋,它...
  • u012632877
  • u012632877
  • 2013年11月06日 17:04
  • 1062

【USACO 2006 November Gold】Corn Fields

【题目链接】          http://oj.jzxx.net/problem.php?id=1459【算法】         状压DP【代码】    #include&lt;bits/...
  • even_bao
  • even_bao
  • 2018年02月12日 18:09
  • 27

【bzoj1907】树的路径覆盖

DescriptionInputOutput Sample Input171 22 32 44 65 66 7 Sample Output3 HINT ,注意此注释有误,第二种情况应该为{...
  • w_yqts
  • w_yqts
  • 2017年07月26日 19:00
  • 85

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

题目大意:给定一个数轴,初始在位置pp,有nn坨草(n≤3000n\leq 3000),约瑟芬需要吃掉所有的草,定义一坨草的腐败值为吃掉的时间,求最小腐败值之和 容易证明任何时刻约瑟芬吃掉的草都是一...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年05月03日 14:58
  • 1248

bzoj 1694 && 1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草(DP)

1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 395  ...
  • Jaihk662
  • Jaihk662
  • 2017年09月19日 21:14
  • 175

BZOJ 1694 [Usaco2007 Demo]Grazing on the Run DP

BZOJ 1694 [Usaco2007 Demo]Grazing on the Run DP
  • wzq_QwQ
  • wzq_QwQ
  • 2015年08月19日 13:11
  • 723
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【BZOJ1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草【区间DP】
举报原因:
原因补充:

(最多只允许输入30个字)