码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1991 Turning in Homework(区间DP)

时间:2017-09-09 21:39:01      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:efi   get   --   for   function   关键字   cti   space   fun   

题目链接 Turning in Homework

考虑区间DP

f[i][j][0]为只考虑区间[i, j]且最后在a[i]位置交作业的答案。

f[i][j][1]为只考虑区间[i, j]且最后在a[j]位置交作业的答案。

首先对a[i]升序排序(位置第一关键字,时间第二关键字)

然后就是区间DP了

f[i][j]可以从f[i][j + 1], f[i - 1][j]推过来。

f[i][j][0] = min(f[i][j][0], max(f[i][j + 1][1] + a[j + 1].fi - a[i].fi, a[i].se))

f[i][j][0] = min(f[i][j][0], max(f[i - 1][j][0] + a[i].fi - a[i - 1].fi, a[i].se))

f[i][j][1] = min(f[i][j][1], max(f[i - 1][j][0] + a[j].fi - a[i - 1].fi, a[j].se));

f[i][j][1] = min(f[i][j][1], max(f[i][j + 1][1] + a[j + 1].fi - a[j].fi, a[j].se));

其中fi代表位置,se代表时间。

最后的答案为min{min(f[i][i][0], f[i][i][1]) + abs(a[i].fi - B)}

B位规定的终点。

时间复杂度$O(n^{2})$

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)
#define MP		make_pair
#define fi		first
#define se		second


typedef long long LL;

const int N = 1010;
int n, m, ed, ans;
pair <int, int> a[N];
int f[N][N][2];


int main(){

	scanf("%d%d%d", &n, &m, &ed);
	rep(i, 1, n) scanf("%d%d", &a[i].fi, &a[i].se);
	sort(a + 1, a + n + 1);

	f[1][n][0] = max(a[1].fi, a[1].se);
	f[1][n][1] = max(a[n].fi, a[n].se);

	dec(d, n - 1, 1){
		rep(i, 1, n - d + 1){
			int j = i + d - 1;
			f[i][j][0] = 1 << 30;
			if (j < n) f[i][j][0] = min(f[i][j][0], max(f[i][j + 1][1] + a[j + 1].fi - a[i].fi, a[i].se));
			if (i > 1) f[i][j][0] = min(f[i][j][0], max(f[i - 1][j][0] + a[i].fi - a[i - 1].fi, a[i].se));
		       	
			f[i][j][1] = 1 << 30;
			if (i > 1) f[i][j][1] = min(f[i][j][1], max(f[i - 1][j][0] + a[j].fi - a[i - 1].fi, a[j].se));
			if (j < n) f[i][j][1] = min(f[i][j][1], max(f[i][j + 1][1] + a[j + 1].fi - a[j].fi, a[j].se));
		}
	}

	ans = 1 << 30;
	rep(i, 1, n) ans = min(ans, min(f[i][i][0], f[i][i][1]) + abs(a[i].fi - ed));
	printf("%d\n", ans);
	return 0;
}

 

POJ 1991 Turning in Homework(区间DP)

标签:efi   get   --   for   function   关键字   cti   space   fun   

原文地址:http://www.cnblogs.com/cxhscst2/p/7499239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!