HDU-4328 Cut the cake

切蛋糕问题:寻找最大周长矩形
博客围绕切蛋糕问题展开,蛋糕被分为n*m块,颜色有红蓝两种。Ray_sun只吃特定形状和颜色的矩形蛋糕块,要求颜色相同或红蓝交错。需找出满足要求的最大周长矩形,给出了输入输出示例及解题思路和代码。

                                                                                           Cut the cake

                                                              Time Limit: 6000/3000 MS (Java/Others)


Problem Description
Mark bought a huge cake, because his friend ray_sun’s birthday is coming. Mark is worried about how to divide the cake since it’s so huge and ray_sun is so strange. Ray_sun is a nut, you can never imagine how strange he was, is, and going to be. He does not eat rice, moves like a cat, sleeps during work and plays games when the rest of the world are sleeping……It is not a surprise when he has some special requirements for the cake. A considering guy as Mark is, he will never let ray_sun down. However, he does have trouble fulfilling ray_sun’s wish this time; could you please give him a hand by solving the following problem for him?


  The cake can be divided into n*m blocks. Each block is colored either in blue or red. Ray_sun will only eat a piece (consisting of several blocks) with special shape and color. First, the shape of the piece should be a rectangle. Second, the color of blocks in the piece should be the same or red-and-blue crisscross. The so called ‘red-and-blue crisscross’ is demonstrated in the following picture. Could you please help Mark to find out the piece with maximum perimeter that satisfies ray_sun’s requirements?


Input
The first line contains a single integer T (T <= 20), the number of test cases.
  For each case, there are two given integers, n, m, (1 <= n, m <= 1000) denoting the dimension of the cake. Following the two integers, there is a n*m matrix where character B stands for blue, R red.
 

Output
For each test case, output the cased number in a format stated below, followed by the maximum perimeter you can find.
 

Sample Input
2
1 1
B
3 3
BBR
RBB
BBB
 

Sample Output
Case #1: 4
Case #2: 8
 

题意:找一个最大矩阵,要么矩阵内所有元素都一样,要么相邻不一样.

思路:只需做两个标记,一个是与上面方块一样的时候的最高最左最右,一个是不一样的时候的最高最左最右.

代码:

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
const int maxn = 1e5+5;

int n,m;
char mp[1234][1234];
int l[1234][1234][3],r[1234][1234][3],u[1234][1234][3],ml[1234][1234][3],mr[1234][1234][3];

int main()
{
	int t,cnt = 0;
	cin>>t;
	
	while(t--)
	{
		mem(mp,0);
		scanf("%d %d",&n,&m);
		for(int i = 1;i<= n;i++)
			scanf(" %s",mp[i]+1);
		
		for(int i = 1;i<= n;i++)
		{
			for(int j = 1;j<= m;j++)
			{
				l[i][j][1] = mp[i][j] == mp[i][j-1]?l[i][j-1][1]:j;
				l[i][j][2] = (mp[i][j] == mp[i][j-1]||j == 1)?j:l[i][j-1][2];
			}
		}
		
		for(int i = 1;i<= n;i++)
		{
			for(int j = m;j>= 1;j--)
			{
				r[i][j][1] = mp[i][j] == mp[i][j+1]?r[i][j+1][1]:j;
				r[i][j][2] = (mp[i][j] == mp[i][j+1]||j == m)?j:r[i][j+1][2];
			}
		}
		
		int ans = 0;
		for(int i = 1;i<= n;i++)
		{
			for(int j = 1;j<= m;j++)
			{
				if(i> 1&&mp[i][j]!= mp[i-1][j])
				{
					ml[i][j][1] = l[i][j][1];
					mr[i][j][1] = r[i][j][1];
					u[i][j][1] = 1;
					ml[i][j][2] = max(l[i][j][2],ml[i-1][j][2]);
					mr[i][j][2] = min(r[i][j][2],mr[i-1][j][2]);
					u[i][j][2] = u[i-1][j][2]+1;
				}
				else if(i> 1&&mp[i][j] == mp[i-1][j])
				{
					ml[i][j][2] = l[i][j][2];
					mr[i][j][2] = r[i][j][2];
					u[i][j][2] = 1;
					ml[i][j][1] = max(l[i][j][1],ml[i-1][j][1]);
					mr[i][j][1] = min(r[i][j][1],mr[i-1][j][1]);
					u[i][j][1] = u[i-1][j][1]+1;
				}
				else
				{
					ml[i][j][1] = l[i][j][1];
					mr[i][j][1] = r[i][j][1];
					u[i][j][1] = 1;
					ml[i][j][2] = l[i][j][2];
					mr[i][j][2] = r[i][j][2];
					u[i][j][2] = 1;
				}
				
				ans = max(ans,max(((mr[i][j][1]-ml[i][j][1]+1)+u[i][j][1])*2,((mr[i][j][2]-ml[i][j][2]+1)+u[i][j][2])*2));
			}
		}
		
		printf("Case #%d: %d\n",++cnt,ans);
	}
	
	return 0;
}

 

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值