最大子矩阵 贪心

Description

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1×1)子矩阵。

比如,如下4×4的矩阵

的最大子矩阵是
  0  -2   -7   0
  9   2   -6   2 
-4    1   -4   1
-1    8    0  -2

这个子矩阵的大小是
 9   2
-4   1
-1   8

这个子矩阵的大小是15。

Input

输入是一个N×N的矩阵。输入的第一行给出N(0<N≤100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[−127,127]。

Output

输出最大子矩阵的大小。

Sample Input

4
0 -2 -7  0
9  2 -6  2
-4  1 -4  1
-1  8  0 -2

Sample Output

15

Source

#include<iostream>
using namespace std;

int a[101][101];
int main()
{
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++)
		{
			cin >> a[i][j];
			a[i][j] += a[i][j-1];//a[i][j]表示第i行 ,1到j列的数值之和 
		}
//	int num, x, y;
//	for(int i = 1; i <= n*n; i++)//另一种存法 
//	{
//		cin >> num;
//		x = (i-1)/n + 1;
//		y = i%n;
//		if(y == 0)
//			y = n;
//		a[x][y] = num;
//		a[x][y] += a[x][y-1];
//	}
	int max = -1, m = 0;
	for(int i = 0; i < n; i++)
		for(int k = i+1; k <= n; ++k)
		{
			m = 0;
			for(int j = 1; j <= n; j++)
			{
				m += a[j][k] - a[j][i];
				if(m > max)
					max = m;
				if(m < 0)
					m = 0;
//				if(m >= 0) // 另一种写法 
//					m += a[j][k] - a[j][i];
//					else
//						m = a[j][k] - a[j][i];
//				if(m > max)
//					max = m;	
			}
		}

	cout << max;
}

这个题的跟求最大子序列类似,这算题动规吧?,最大的子矩阵和要么在前面,要么在后面,要么在中间,取两个变量m,max,m为不断累加的值,累加到小于等于0时就置零,保证后面加到的数不受前面影响。在累加过程中由max存最大的m值。

对矩阵的数据处理:

a[i][j] += a[i][j-1];// a[i][j]保存第i行1~j列数值之和

或者  a[i][j] += a[i-1][j]//a[i][j]保存第j列1~i行数值之和

通过三层循环依次计算每个矩阵的和 m += a[k][j] - a[k][i] 或者 m+= a[j][k] - a[i][k]; 

都值得学习。

这样看来由这个题可以发散的出很多种求最小类似字母型的矩阵(这样还叫矩阵吗)的和,没事想想处理方法也挺有意思的。

 

 

最大矩阵问题是一个经典的算法问题,可以通过贪心算法来解决。贪心算法的基本思想是每一步都做出局部最优的选择,以求得全局最优解。 在解决最大矩阵问题时,可以利用动态规划的思想。我们可以定义一个辅助矩阵dp,其dp[i][j表示以矩阵第i行第j列元素为右下角的矩阵最大大小。然后,我们可以通过以下递推关系来计算dp矩阵的每个元素: dp[i][j = matrix[i][j + dp[i-1][j + dp[i][j-1 - dp[i-1][j-1] 其,matrix[i][j表示原始矩阵第i行第j列的元素。 然后,我们可以遍历dp矩阵的每个元素找到最大值,即为最大矩阵大小。 对于给定的例,我们可以得到以下dp矩阵: 0 -2 -9 -9 9 11 1 0 5 -1 -2 -1 4 3 5 6 其最大矩阵大小为15,对应的矩阵为: 9 2 -4 1 -1 8 因此,最大矩阵大小为15。 可以看出,通过利用贪心算法和动态规划的思想,我们可以高效地解决最大矩阵问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [最大矩阵贪心算法)](https://blog.csdn.net/Annconda/article/details/127173365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [贪心算法——1224:最大矩阵](https://blog.csdn.net/qq_45700119/article/details/122025478)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [最大矩阵——贪心算法](https://blog.csdn.net/FENGXUEYINCHEN/article/details/111940408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值