一.题目描述
给定一个n*n(0< n <=100)的矩阵,矩阵中的元素均为整数。请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。、
二.思路描述
动态规划思想
和求数组中的最大字段和问题相似,都运用了动态规划,设计一个容器储存目前的已知计算结果。
三.源代码
-
#include<iostream> using namespace std; int main() { int n; cin>>n; int num[n][n]={0}; int Max[n]={0}; int MMax[n]={0}; int M=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>num[i][j]; } } for(int k=0;k<n;k++) { for(int i=k;i<n;i++) { for(int j=0;j<n;j++) { Max[j]=num[i][j]+Max[j];//统计求和 } for(int j=0;j<n;j++) { if(j==0) { if(Max[j]<0) { MMax[j]=0; } else { MMax[j]=Max[j]; } } if(j>0) { if(MMax[j-1]+Max[j]>MMax[j]) { MMax[j]=MMax[j-1]+Max[j]; } } if(M<MMax[j]) { M=MMax[j];//求出最大值 } }//求出这一行的最大子段和 for(int j=0;j<n;j++) { MMax[j]=0; }//将比较数组置零 } for(int j=0;j<n;j++) { Max[j]=0; } } cout<<M<<endl; return 0; }
四.测试数据及运行结果
1.测试数据
5
0 -2 -7 0 9
9 2 -6 2 3
-4 1 -4 1 6
-1 8 0 -2 8
-2 2 8 9 1
5
8 -10 -2 -9 -6
-3 2 5 9 -3
7 9 -5 3 -6
-1 9 1 -5 7
-7 9 3 -6 7
2.结果
五.遇到的问题及解决方法
在循环过程中,容器需要及时清零,
核心思想是
if(MMax[j-1]+Max[j]>MMax[j])
{
MMax[j]=MMax[j-1]+Max[j];
}
比较后进行复制,简而言之就是舍去负值,注意容器的第一个需要额外说明,
if(j==0)
{
if(Max[j]<0)
{
MMax[j]=0;
}
else
{
MMax[j]=Max[j];
}
}
因为边界处不满足该条件。