程序按照小伙伴 信1201-1班 曹坤的思路已经实现了,下面是我的思路,
首先从二维数组第一个点a[0][0]开始,找所有可能和他组成子数组的点,记录下子数组的和,然后选择和a[0][0]挨着的点依次类推,结果就是求得所有可能情况的子数组的和;找出最大的~
我的程序没能成功实现
程序源代码;
#include <iostream>
using namespace std;
void maxSubArray(int **,int ,int ,int []);
int main()
{
int n,m;
printf("请输入二维数组的行数和列数:\n");
scanf("%d %d",&n,&m);
int i,j;
int *c=new int[(m*n*(m*n-1))];
int **a=new int*[n];
printf("请输入%d*%d个二维数组元素:\n",n,m);
for(i=0;i<n;i++)
{
a[i]=new int[m];
for(j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
}
maxSubArray(a,n,m,c);
return 0;
}
void maxSubArray(int **a,int n,int m,int c[])
{
int d=0;
int result=0;
for(int a1=0;a1<n;a1++) {
for(int b1=0;b1<m;b1++){
for(int a2=a1+1;a1<n;a2++){
for(int b2=b1+1;b2<m;b2++){
int sum=0;
for(int a3=a1;a3<=a2;a3++){
for(int b3=b1;b3<=b2;b3++){
sum+=a[a3][b3];
}
}
c[d]=sum;
d++;
}
}
}
}
for(int a4=0;a4<d;a4++){
if(result<c[d])
result=c[d];
}
printf("二维数组的最大子数组之和是:%d\n",result);
}
运行截图
可能是for循环嵌套的太多了,下去我再找找方法