问题:就是输入一个N*M的矩阵,找出在矩阵中,所有元素加起来之和最大的子矩阵。
思路:将输入的矩阵每一列求前几项和,此时矩阵的每一行都相当于一个二维矩阵,此后用求最大子序列求最大值即可。
#include <stdio.h> #include <iostream> #include <math.h> #include <string.h> using namespace std; const double PI=acos(-1.0); const int inf=0x7fffffff; int a[105][105]; int dp[105][105]; int n,m,mx,sum; int main(){ mx=-inf; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; mx=max(mx,a[i][j]); } } if(mx<0) cout<<mx;//若矩阵最大元素都小于0,直接输出最大值即可 else{ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ a[i][j]=a[i-1][j]+a[i][j];//将每一列求前几项和,此后的每一行都可以理解成一个二维矩阵。 } } for(int i=1;i<=n;i++){ //i:减去矩阵的行数 for(int j=i;j<=n;j++){ //j:处理的矩阵开始的行数 sum=0; //每次处理一个矩阵开始,sum归0 for(int k=1;k<=m;k++){ //每次处理矩阵要遍历每一列,相当于用求最大子序列算法 if(sum+a[j][k]-a[i-1][k]<0){ sum=0; } else{ sum+=a[j][k]-a[i-1][k]; } mx=max(mx,sum); //每处理完一个矩阵要更新最大值 } } } } cout<<mx; return 0; }