二维数组首尾相接,象个一条首尾相接带子一样,求所有子数组和的最大值
2015-04-05 09:51
393 查看
题目:返回一个二维整数数组中最大子数组的和。
要求:
1 输入一个二维整形数组,数组里有正数也有负数。
2 二维数组首尾相接,象个一条首尾相接带子一样。
3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
4 求所有子数组的和的最大值。要求时间复杂度为O(n)。
设计思想
目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案
源代码
程序截图
实验总结
此次试验的收获就是熟悉了%和for循环语句的配合对于数组问题产生的效果,对于达到时间复杂度达到o(n),想出的方法大多都无法达到要求,只能再查找资料找寻新的思路了,之后会贴在下面。
要求:
1 输入一个二维整形数组,数组里有正数也有负数。
2 二维数组首尾相接,象个一条首尾相接带子一样。
3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
4 求所有子数组的和的最大值。要求时间复杂度为O(n)。
设计思想
目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案
源代码
#include<iostream> #include<time.h> #include<conio.h> #include<fstream> using namespace std; ofstream out; void RandIn(int RowIntNum,int ColIntNum,int A[][100])//随机生成一个二维数组 { for(int i=0;i<RowIntNum;i++) { for(int j=0;j<ColIntNum;j++) { A[i][j]=-(int)rand()%201+100; cout<<A[i][j]<<'\t'; } cout<<endl; } } int MaxArray(int array[],int Maxsize,int &Location) { int max=array[0];//生成最大数值 Location=0;//最大数值下标位置初始化 for(int i=0;i<Maxsize;i++) { if(max<array[i]) { max=array[i]; Location=i; } } return max; } void DivANum(int A[][100],int RowIntNum,int ColIntNum,int SubRowNum,int SubColNum,int EveTSum[],int &Location,int Times) { int sum[10000];//记录子矩阵的和 int ArrayNum=0;//生成子矩阵的数目 int count=0;//子矩阵累加次数 for(int row=0;row<RowIntNum-SubRowNum+1;row++) { for(int col=0;col<ColIntNum;col++)//求所有子矩阵 { sum[ArrayNum]=0; for(int p=row;p<row+SubRowNum;p++)//求得子矩阵的和 { for(int q=col;q<col+SubColNum;q++) { sum[ArrayNum]+=A[p][q%ColIntNum]; } } ArrayNum++;//记录生成的子矩阵数 } } EveTSum[Times]=MaxArray(sum,ArrayNum,Location);//记录每次生成的子矩阵中的最大子矩阵数值 } void Print(int row,int col, int array[][100]) { for(int i=0;i<row;i++) { for(int j=0;j<col;j++) { out<<array[i][j]<<','; } out<<'\n'; } } void main() { out.open("text.txt"); srand((unsigned)time(NULL)); int Location[100];//记录每次最大子数组的位置 int A[100][100],RowIntNum,ColIntNum; int SubRowNum,SubColNum; int max=0,LocTimes=0; int EveTSum[10000]; int q=0; while(q==0) { cout<<"请输入行数:"; cin>>RowIntNum; out<<RowIntNum<<','; cout<<"请输入列数:"; cin>>ColIntNum; out<<ColIntNum<<','<<'\n'; cout<<"整数内容"<<endl; RandIn(RowIntNum,ColIntNum,A);//随机生成RowIntNum行,ColIntNum列的数组 Print(RowIntNum,ColIntNum,A); for(SubRowNum=1;SubRowNum<=RowIntNum;SubRowNum++) { for(SubColNum=1;SubColNum<=ColIntNum;SubColNum++) { DivANum(A,RowIntNum,ColIntNum,SubRowNum,SubColNum,EveTSum,Location[(SubRowNum-1)*RowIntNum+SubColNum-1],(SubRowNum-1)*RowIntNum+SubColNum-1); } } cout<<"输出最大矩阵的和"<<endl; max=MaxArray(EveTSum,(SubRowNum-1)*(SubColNum-1),LocTimes); cout<<max<<endl; out<<max; out.close(); cout<<"是否继续测试(输入0继续)"<<endl; cin>>q; system("cls"); } }
程序截图
实验总结
此次试验的收获就是熟悉了%和for循环语句的配合对于数组问题产生的效果,对于达到时间复杂度达到o(n),想出的方法大多都无法达到要求,只能再查找资料找寻新的思路了,之后会贴在下面。
相关文章推荐
- 二维数组求子数组之和最大值(首尾相接, 圆柱)
- 结对开发(求二维首尾相接数组的最大子数组和)
- 最大子数组的和首尾相接(3)
- 首尾连接的二维数组中连续子数组的最大和
- 数组中子数组之和最大值(首尾相接)
- 结对开发-返回一个整数数组中最大子数组的和(首尾相接版)
- 有一个整型二维数组,假设a[3][4] = {初始化了值},求出这个二维数组中所有的最大值,以及最大值对应的下标。 数组内部原有的值不能改变位置。
- 首尾相接的数组的子数组的最大值
- 求一个二维数组的最大子矩阵的和(令矩阵的行首尾相接为环)
- 结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)
- 返回一个首尾相接的二维整数数组中最大子数组的和
- 首尾相接数组求子数组最大和
- 课后实验5--返回一个整数数组中最大子数组的和(首尾相接改良版)
- 数组2——数组首尾相接,求最大子数组
- 首尾连接的二维数组中连续子数组的最大和
- 首尾相接整数数组中最大子数组的和
- 1.将数组A中的内容和数组B中的内容进行交换。(数组一样大) 2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。 3.将三个数按从大到小输出。 4.求两个数的最大公约数。
- 软件工程课程作业(五)--返回一个整数数组中最大子数组的和(首尾相接改良版)
- 返回一个首尾相接的二维整数数组中最大子数组的和
- 首尾相接最大子数组和