最大子矩阵和
程序员文章站
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;
}