题意:输入一个二维数组,求和最大的子矩阵
分析:一看到和最大的子XX,我就联想到和最大子序列,只不过那是一维这是二维,所以做法都差不多。把二维压缩成一维:你想啊一个矩阵的和不是可以先垂直方向相加把所有行压缩为一行然后这一行相加嘛。压缩过后找最大和的方法跟一维一模一样。但我自己做的时候写了四个循环,唉.....数组可以存放之前求过的和,那么求以下一行为结尾的和的时候只要在原来的数组上加这一行的数就行了,不需要从头循环求和!
dp[k]=a[i][k]+.....+a[j][k] 第 k 列第 i 行加到 j 行的和,起点 i、终点 j 要枚举遍历的,需要两个循环;k列也要一个循环,但是不需要一个循环每次for(int p=i;p<=j;p++)了,因为可以用前面已经加过的和
代码:
#include<iostream> #include<cstring> #define INF 1000000009 using namespace std; int n,a[200][200],dp[200]; int ans,sum; int main() { while(cin>>n){ for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a[i][j]; ans=-INF; for(int i=0;i<n;i++){ memset(dp,0,sizeof(dp)); for(int j=i;j<n;j++){ sum=-1; for(int k=0;k<n;k++){ dp[k]+=a[j][k]; } for(int k=0;k<n;k++){ if(sum<0) sum=dp[k]; else sum+=dp[k]; if(ans<sum) ans=sum; } } } cout<<ans<<endl; } }
时间: 2024-10-19 03:09:22