《返回一个二维整数数组中最大联通子数组的和》
《返回一个二维整数数组中最大联通子数组的和》
设计思想:(1)首先把这个二维数组按行的数目分解为与列数目具有相同数目的一维数组;
(2)再分别求出这几个一维数组的最大连续子数组之和,分别记录每一个最大连续数组的首末位置;
(3)接着分别比较看这几个一维数组的首末位置是否处于矩阵上相连的位置,找出位置上相连且之和为最大的数组,输出它们的和即可。
源代码:
#include<iostream> using namespace std; int Max(int n,int a[],int *smark,int *mmark) { int b[100]={0}; int i,sum1=0,max1=0; for(i=0;i<n;i++) { if(sum1<0) { sum1=a[i]; } else { sum1=sum1+a[i]; } b[i]=sum1; } max1=b[0]; for(i=0;i<n;i++) { if (max1<b[i]) { max1= b[i]; *mmark = i; } } for (i = *mmark;i >= 0;i--) { if (b[i] == a[i]) { *smark = i; break; } } return max1; } void main() { int m,n,i,j,smark,mmark,t2; int sum; int up[100],down[100],t[100]; int a[100][100],b[100]; cout<<"请输入二维数组的行数和列数:"; cin>>m>>n; cout<<"请输入这个二维矩阵:"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) { cin>>a[i][j]; } } //把二维数组按行分解为几个一维数组 for(i=0;i<m;i++) { for(j=0;j<n;j++) { b[j]=a[i][j]; } sum=Max(n,b,&smark,&mmark); up[i]=smark; down[i]=mmark; t[i]=sum; } t2=t[0]; for(i=0;i+1<m;i++) { if(up[i]<=down[i+1] && down[i]>=up[i+1]) { t2+=t[i+1]; } for(j=up[i];j<up[i+1];j++) { if(a[i+1][j]>0) t2+=a[i+1][j]; //判别独立正数 } } cout<<t2<<endl; }
实验结果截图:
编程总结:虽然理解了题目的要求,也明白了输入了什么之后应该得到什么结果,但是在设计算法是还是遇到了一定的困难,老是在进入死胡同后就找不到了解决的方法了,由此写这个程序拖了很久很久,再后来在借鉴了别人的思想以及同学的帮助下还是基本上完成了任务,所以我觉得我之所以没有很好的解决思路和方法就是因为平时练得太少了,思维停滞了,因此多练,多看,多查相关资料,多借鉴好的思想是我今后需要逐步深入的!