【动态规划】采油区域

原创 2012年03月29日 11:48:02

采油区域
Siruseri 政府决定将石油资源丰富的 Navalur 省的土地拍卖给私人承包商以
建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N 个小块。
Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示
为M×N 个正整数,即对每一小块土地石油储量的估计值。
为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K 块相连的
土地构成的正方形区域。
AoE石油联合公司由三个承包商组成,他们想选择三块互不相交的 K×K 的
区域使得总的收益最大。
例如,假设石油储量的估计值如下:
 
1  1  1  1  1  1  1  1  1
1  1  1  1  1  1  1  1  1
1  8  8  8  8  8  1  1  1
1  8  8  8  8  8  1  1  1
1  8  8  8  8  8  1  1  1
1  1  1  1  8  8  8  1  1
1  1  1  1  1  1  8  8  8
1  1  1  1  1  1  9  9  9
1  1  1  1  1  1  9  9  9
 
如果 K  =  2,  AoE 公司可以承包的区域的石油储量总和为 100,  如果 K  =  3,
AoE公司可以承包的区域的石油储量总和为 208。
AoE公司雇佣你来写一个程序,帮助计算出他们可以承包的区域的石油储量
之和的最大值。
输入格式
输入第一行包含三个整数 M, N, K,其中 M和N 是矩形区域的行数和列数,
K 是每一个承包商承包的正方形的大小(边长的块数) 。接下来 M行,每行有 N
个正整数表示这一行每一小块土地的石油储量的估计值。
输出格式
输出只包含一个正整数,表示 AoE 公司可以承包的区域的石油储量之和的
最大值。
采油区域
Siruseri 政府决定将石油资源丰富的 Navalur 省的土地拍卖给私人承包商以
建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N 个小块。
Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示
为M×N 个正整数,即对每一小块土地石油储量的估计值。
为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K 块相连的
土地构成的正方形区域。
AoE石油联合公司由三个承包商组成,他们想选择三块互不相交的 K×K 的
区域使得总的收益最大。
例如,假设石油储量的估计值如下:
 
1  1  1  1  1  1  1  1  1
1  1  1  1  1  1  1  1  1
1  8  8  8  8  8  1  1  1
1  8  8  8  8  8  1  1  1
1  8  8  8  8  8  1  1  1
1  1  1  1  8  8  8  1  1
1  1  1  1  1  1  8  8  8
1  1  1  1  1  1  9  9  9
1  1  1  1  1  1  9  9  9
 
如果 K  =  2,  AoE 公司可以承包的区域的石油储量总和为 100,  如果 K  =  3,
AoE公司可以承包的区域的石油储量总和为 208。
AoE公司雇佣你来写一个程序,帮助计算出他们可以承包的区域的石油储量
之和的最大值。
输入格式
输入第一行包含三个整数 M, N, K,其中 M和N 是矩形区域的行数和列数,
K 是每一个承包商承包的正方形的大小(边长的块数) 。接下来 M行,每行有 N
个正整数表示这一行每一小块土地的石油储量的估计值。
输出格式
输出只包含一个正整数,表示 AoE 公司可以承包的区域的石油储量之和的
最大值。




这种题到现在应该都是对于我们应该是很熟练的题目了。但是不知道为什么做不起。。。

代码比较长,但是确实是NOIP难度,一次AC了。


因为有三个块,因此可以分成六种情况

维护4种前缀和,然后递推算出rect1~4,表示前i行前j列最大的矩形,前i行后j列最大的矩形,后i行前j列最大的矩形,后i行后j列最大的矩形。

同时递推算出前i行右下角横坐标为j的最大矩形,前j列右下角纵坐标为i的最大矩形。

枚举两条割线就可以得出答案了。



一开始我想用悬线法用吃西瓜的那种方法来做,打完了调了很久了才发现有反例,结果错完了。总结出考试一定不能急躁,一定要考虑清楚再开动。


反例很简单就是这个,两个矩形的割线不一样


#include <cstdio>

long n;long m;long K;
long map[1510][1510];

long sum1[1510][1510];//left and above
long sum2[1510][1510];//right and above
long sum3[1510][1510];//left and below
long sum4[1510][1510];//right and below

long rect1[1510][1510];//left and above
long rect2[1510][1510];//right and above
long rect3[1510][1510];//left and below
long rect4[1510][1510];//right and below

long rectA[1510][1510];
long rectB[1510][1510];

#define MAX(a,b) (a>b?a:b)

int main()
{
	freopen("oil.in","r",stdin);
	freopen("oil.out","w",stdout);
	scanf("%ld%ld%ld",&n,&m,&K);
	for (long i=1;i<n+1;i++)
	{
		for (long j=1;j<m+1;j++)
		{
			scanf("%ld",map[i]+j);
			sum1[i][j] = sum1[i][j-1]+map[i][j];
			sum3[i][j] = sum1[i][j];
		}
	}
	for (long i=1;i<n+1;i++)
	{
		for (long j=m;j>0;j--)
		{
			sum2[i][j] = sum2[i][j+1]+map[i][j];
			sum4[i][j] = sum2[i][j];
		}
	}
	for (long i=1;i<n+1;i++)
	{
		for (long j=1;j<m+1;j++)
		{
			sum1[i][j] += sum1[i-1][j];
			sum2[i][j] += sum2[i-1][j];
		}
	}
	for (long i=n;i>0;i--)
	{
		for (long j=m;j>0;j--)
		{
			sum3[i][j] += sum3[i+1][j];
			sum4[i][j] += sum4[i+1][j];
		}
	}

	for (long i=1;i<n+1;i++)
	{
		for (long j=1;j<m+1;j++)
		{
			if (i-K>=0 && j-K>=0)
			{
				rect1[i][j] = sum1[i][j]-sum1[i][j-K]-sum1[i-K][j]+sum1[i-K][j-K];//left and above
				rectA[i][j] = rect1[i][j];
			}
			if (i-K>=0 && j+K-1<=m)
				rect2[i][j] = sum2[i][j]-sum2[i][j+K]-sum2[i-K][j]+sum2[i-K][j+K];//right and above
			if (i+K-1<=n && j-K>=0)
			{
				rect3[i][j] = sum3[i][j]-sum3[i][j-K]-sum3[i+K][j]+sum3[i+K][j-K];//left and blow
				rectB[i][j] = rect3[i][j];
			}
			if (i+K-1<=n && j+K-1<=m)
				rect4[i][j] = sum4[i][j]-sum4[i][j+K]-sum4[i+K][j]+sum4[i+K][j+K];//right and blow
		}	
	}
	
	for (long i=1;i<n+1;i++)
	{
		for (long j=1;j<m+1;j++)
		{
			rect1[i][j] = MAX(rect1[i][j],rect1[i-1][j]);
			rect1[i][j] = MAX(rect1[i][j],rect1[i][j-1]);
			
			rectA[i][j] = MAX(rectA[i][j],rectA[i][j-1]);
			rectB[i][j] = MAX(rectB[i][j],rectB[i-1][j]);
		}
	}
	
	for (long i=1;i<n+1;i++)
	{
		for (long j=m;j>0;j--)
		{
			rect2[i][j] = MAX(rect2[i][j],rect2[i-1][j]);
			rect2[i][j] = MAX(rect2[i][j],rect2[i][j+1]);
		}
	}
	
	for (long i=n;i>0;i--)
	{
		for (long j=1;j<m+1;j++)
		{
			rect3[i][j] = MAX(rect3[i][j],rect3[i+1][j]);
			rect3[i][j] = MAX(rect3[i][j],rect3[i][j-1]);
		}
	}
	
	for (long i=n;i>0;i--)
	{
		for (long j=m;j>0;j--)
		{
			rect4[i][j] = MAX(rect4[i][j],rect4[i+1][j]);
			rect4[i][j] = MAX(rect4[i][j],rect4[i][j+1]);
		}
	}
	
	
	long ans = 0;
	
	for (long i=1+K;i<n-K+2;i++)
	{
		for (long j=1+K;j<m-K+2;j++)
		{
			ans = MAX(ans,rect1[i-1][j-1]+rect2[i-1][j]+rect4[i][1]);
			ans = MAX(ans,rect3[i][j-1]+rect4[i][j]+rect2[i-1][1]);
			ans = MAX(ans,rect1[i-1][j-1]+rect3[i][j-1]+rect4[1][j]);
			ans = MAX(ans,rect2[i-1][j]+rect4[i][j]+rect3[1][j-1]);
		}	
	}	
	for (long i=1+K;i<n-2*K+1;i++)
	{
		ans = MAX(ans,rect2[i-1][1]+rect4[i+K][1]+rectA[i+K-1][m]);
	}
	for (long j=1+K;j<m-2*K+1;j++)
	{
		ans = MAX(ans,rect3[1][j-1]+rect4[1][j+K]+rectB[n][j+K-1]);
	}
	printf("%ld",ans);
	return 0;
}


相关文章推荐

采油区域-APIO 2009

算法训练 采油区域   时间限制:2.0s   内存限制:512.0MB   采油区域  Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油...
  • wximo
  • wximo
  • 2014年05月19日 21:30
  • 2041

【APIO2009T1】采油区域-分类讨论+动态规划

【APIO2009T1】采油区域-分类讨论+动态规划

【动态规划】采油区域

Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。 Siruseri地质调查局有关于Navalur土地石油...
  • Whjpji
  • Whjpji
  • 2012年03月30日 08:10
  • 3054

蓝桥杯练习系统OJ题解目录

基础练习 蓝桥杯 BASIC-27 基础练习 2n皇后问题 蓝桥杯 BASIC-18 基础练习 矩形面积交 蓝桥杯BASIC-28 基础练习 Huffuman树 蓝桥杯 BASIC-21 基础练习 ...
  • liuchuo
  • liuchuo
  • 2016年08月04日 02:05
  • 1219

【花样枚举】bzoj 1177 apio2009采油区域

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1177 题目大意:给你一个矩阵,让你选出三个边长为k且互不重叠的正方形使得所有正方形内的数...

华为oj题目(java版)

趁着临近过年,公司工作不忙,去刷了一下华为oj题目,特此记录一下。                题目地址:我是在牛客网上刷的题,地址:http://www.nowcoder.com/ta/huawe...

【动态规划】采油区域

Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。 Siruseri地质调查局有关于Navalur土地石油...
  • Whjpji
  • Whjpji
  • 2012年03月30日 08:10
  • 3054

【花样枚举】bzoj 1177 apio2009采油区域

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1177 题目大意:给你一个矩阵,让你选出三个边长为k且互不重叠的正方形使得所有正方形内的数...

动态规划,建桥问题代码

  • 2017年11月09日 17:06
  • 340KB
  • 下载

动态规划 源码

  • 2017年10月31日 10:51
  • 12KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【动态规划】采油区域
举报原因:
原因补充:

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