王道机试指南 例题12.3 最大子矩阵
题目:
算法及思路:
代码:
#include <iostream> #include <ostream> #include <algorithm> using namespace std; int MaxSeqSum(int* a,int n){//动态规划求一维数组的最大子序列和 int dpi[n]; for(int i=0;i<n;i++){ if(i==0) dpi[i]=a[i]; else{ dpi[i]=max(dpi[i-1]+a[i],a[i]); } } sort(dpi,dpi+n); return dpi[n-1]; } int main() { int n; while(cin>>n){ int a[n][n]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a[i][j]; int max=0; for(int s=0;s<n;s++){//遍历所有从s行到e行的情况 for(int e=s;e<n;e++){ int rowSum[n]; for(int l=0;l<n;l++) rowSum[l]=0; for(int j=0;j<n;j++)//从s行到e行的每列元素累加形成一维的rowSum for(int i=s;i<=e;i++) rowSum[j]+=a[i][j]; int t= MaxSeqSum(rowSum,n);//求一维数组的最大子序列和 if(t>max) max=t;//记录最大值 } } cout<<max<<endl; } return 0; }
运行结果: