欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最大子矩阵和

程序员文章站 2022-07-16 11:53:01
...

一、题目
题目描述:现给出一个N*N矩阵,要求求出拥有最大和的子矩阵的和。例子如下图所示:
最大子矩阵和
具体解法:引用别人的:

https://blog.csdn.net/qq_39559641/article/details/98721603?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158467517419724845038945%2522%252C%2522scm%2522%253A%252220140713.130056874…%2522%257D&request_id=158467517419724845038945&biz_id=0&utm_source=distribute.pc_search_result.none-task

讲我的理解,给大家借鉴
1、矩阵变成一维矩阵的方法:即第n行m列的值为0行m列到n-1行m列的累加和,sum二维数组为什么空一行,是为防止头一行不能没有加,具体看代码
最大子矩阵和
2、引用的核心代码的意思是枚举,有行减,和列减

3、代码

#include<stdio.h>
#define N 4
int main(){
	int a[N][N] = { {0,-2,-7,0},
                    {9,2,-6,2},
                    {-4,1,-4,1},
                    {-1,8,0,-2}};
    int sun[N+1][N]={0};
    int remax=0;
    int i,j,k;
    int temp=0;
    //转换为一维数组 
    for(i=1;i<N+1;i++)
       for(j=0;j<N;j++){
       	sun[i][j]=sun[i-1][j]+a[i-1][j];
	}
	//动态规划 
    for(i=0;i<N;i++)
      for(j=i+1;j<N+1;j++){                               //i为N,j为N+1,因为实际是j 
      	temp=0;
      	for(k=0;k<N;k++){
      		temp=temp+sun[j][k]-sun[i][k];                     //减行 
      		if(temp>remax)
      		   remax=temp;
      		if(temp<0)
      		   temp=0;                                        //减列 
		  }
	  }
	  printf("%d",remax);
	  return 0;
} 
相关标签: 算法