求二维矩阵和最大的子矩阵
2015-03-22 13:52
393 查看
一、题目
求二维矩阵中和最大的子矩阵。
二、设计思路
将二维数组转化为一维数组,在运用一维数组求最大子数组方法求出。c[0][]=a[0][];c[1][]=a[0][]+a[1][];依次往下。
将二维数组存到txt文件中。
三、源代码
四、截图
五、实验总结
本次实验在文件写入方面,我与他找了些许资料。最终解决了。在思路方面,我们想延用以为数组的方法,但是对于我想象不到如何二维数组怎么使用,但是他提出我们把所有的都列举出来吧。顿时想到转化为一维数组的方法,运用到了程序里。一个人的思维总是有限的,只有思想的碰撞,往往才有更多的激发。
六、我们的合照
求二维矩阵中和最大的子矩阵。
二、设计思路
将二维数组转化为一维数组,在运用一维数组求最大子数组方法求出。c[0][]=a[0][];c[1][]=a[0][]+a[1][];依次往下。
将二维数组存到txt文件中。
三、源代码
#include<iostream.h> #include<fstream.h> void writeFile(int a[][20],int length,int row)//文件写入 { ofstream outFile; outFile.open("test.txt",ios::app); for(int i=0;i<row;i++) { for(int j=0;j<length;j++) { outFile<<a[i][j]<<" "; } outFile<<endl; } outFile.close(); } int max1(int a[],int N); int column(int a[][20],int length,int num1) //求最大和 { int y=0; int d[20]; int e[100]; int c[100][20]; c[0][0]=0; int p=0; int b[100]={0}; for(int j=0;j<num1;j++) { for(int t=j;t<num1;t++) { for(int i=0;i<length;i++) { b[i]=b[i]+a[t][i]; c[p][i]=b[i]; } p=p+1; } for(int o=0;o<100;o++) { b[o]=0; } } for(int l=0;l<p;l++) { for(int u=0;u<length;u++) { d[u]=c[l][u]; //cout<<d[u]<<" "; } e[y++]=max1(d,length); //cout<<e[y-1]<<" "; } int Max=e[0]; for(int i=0;i<y;i++) { if(e[i]>=Max) { Max=e[i]; } } return Max; } int max1(int a[],int N) //球一维最大和 { int b[20]; //正负交替数组 int c[20]; //最终比较数组 int i; int M; //存放数组b的长度 int j=0; int max; //存放最大值 int p=0; int sum; //相邻正数和 int sum1; //相邻负数和 sum=0; sum1=0; int u=0; //判断数组是否全负 for(i=0;i<N;i++) { if(a[i]>=0) { u=1; } } if(u==1) { //求出相邻正数或相邻负数的和,形成正负交替数组 for(i=0;i<N;i++) { if(a[i]>=0) { if(i<N-1) { if(a[i+1]>=0) { sum=sum+a[i]; } else { b[j++]=sum+a[i]; sum=0; } } else { if(a[i-1]>=0) { b[j++]=sum+a[N-1]; } else { b[j++]=a[N-1]; } } } else if(a[i]<0) { if(i<N-1) { if(a[i+1]<0) { sum1=sum1+a[i]; } else { b[j++]=sum1+a[i]; sum1=0; } } else { if(a[i-1]<0) { b[j++]=sum1+a[N-1]; } else { b[j++]=a[N-1]; } } } } M=j; if(b[0]<0) { j=1; } else { j=0; } //对数组B进行操作,将利用算法求的机最大值存入数组c中 for(int y=j;y<M;y=y+2) { if(y+2<M) { if(b[y]+b[y+1]>=0) { c[p++]=b[y]; b[y+2]=b[y+2]+b[y+1]+b[y]; if((y+2==M-1)||(y+2==M-2)) { c[p++]=b[y+2]; break; } } else { c[p++]=b[y]; } } else { c[p++]=b[y]; } } //对数组c求最大值 max=c[0]; for(i=0;i<p;i++) { if(c[i]>=max) { max=c[i]; } } return max; } else { max=a[0]; for(i=0;i<N;i++) { if(a[i]>=max) { max=a[i]; } } return max; } } int main() { ofstream outFile; outFile.open("test.txt",ios::app); int a[20][20]; int length,index; cout<<"输入行数列数:"; cin>>index>>length; outFile<<"行数:"<<index<<endl; outFile<<"列数:"<<length<<endl; outFile.close(); int y=0; for(int i=0;i<index;i++) { for(int j=0;j<length;j++) { cin>>a[i][j]; } } writeFile(a,length,index); int s=column(a,length,index); cout<<"最大和为:"<<s<<endl; return 0; }
四、截图
五、实验总结
本次实验在文件写入方面,我与他找了些许资料。最终解决了。在思路方面,我们想延用以为数组的方法,但是对于我想象不到如何二维数组怎么使用,但是他提出我们把所有的都列举出来吧。顿时想到转化为一维数组的方法,运用到了程序里。一个人的思维总是有限的,只有思想的碰撞,往往才有更多的激发。
六、我们的合照
相关文章推荐
- 【左神算法课】二维矩阵的子矩阵最大累加和
- 求矩阵中元素和最大的二维子矩阵
- 求二维矩阵最大子矩阵和
- 【动态规划】求二维矩阵的最大和子矩阵
- 求二维矩阵和最大的子矩阵
- 微软算法100道题------求一个矩阵中最大的二维矩阵(元素和最大)
- 返回一个二维循环数组中最大子矩阵的和
- 最大子矩阵(子矩阵大小固定)
- 最大子矩阵(二维树状数组)
- 九度OJ 1139:最大子矩阵 (矩阵运算、缓存)
- 求一个矩阵中最大的二维矩阵(元素和最大)
- 【原】 POJ 1050 To the Max 求二维矩阵的最大子矩阵 解题报告
- poj 1050 求矩阵最大的子矩阵和 DP
- 二维矩阵由左上角到右下角只能向右或向下走所有可能路径取值之和最大值
- 微软100题(35)矩阵的最大子矩阵
- 求一个矩阵中最大的二维矩阵 【微软面试100题 第三十五题】
- PHP 求n*m二维矩阵最大子矩阵 O(n*n*m)
- 求一个矩阵中最大的二维矩阵(元素和最大)
- 29. 微软面试题:求一个矩阵中最大的二维矩阵(元素和最大)
- HDU 1505 City Game(DP求二维最大子矩阵)