求数组的所有子数组的和的最大值(二维)
2014-03-19 16:47
316 查看
组员:蔡容玉 张丹丹
题目:求数组的所有子数组的和的最大值(二维)
思路:首先我们考虑的是最直接最简单的穷举法,然后又考虑了老师提出的找最大正数(优先)或最小负数(排除)方法,但是考虑到这个方法可能出错,于是我们便参考资料,想到了另一种方法:枚举法
把二维的问题化成一维的问题,首先我们知道某子矩阵的上,下边界分别是a行和b行,接下来我们应该要确定左右边界;把a行和b行之间的每一列看作是一个整体,定义为:DC[1],DC[2],DC[3],……DC[M],把他们看作一个元素并求出最大值;这样就把二维问题转化为一维问题。另外,二维情况下我们定义部分和:PS[i][j] 等于以(1,1)、(i,1)、(1,j)、(i,j)为顶点的矩形区域的元素之和。
源代码:
运行结果:
以上!谢谢!
题目:求数组的所有子数组的和的最大值(二维)
思路:首先我们考虑的是最直接最简单的穷举法,然后又考虑了老师提出的找最大正数(优先)或最小负数(排除)方法,但是考虑到这个方法可能出错,于是我们便参考资料,想到了另一种方法:枚举法
把二维的问题化成一维的问题,首先我们知道某子矩阵的上,下边界分别是a行和b行,接下来我们应该要确定左右边界;把a行和b行之间的每一列看作是一个整体,定义为:DC[1],DC[2],DC[3],……DC[M],把他们看作一个元素并求出最大值;这样就把二维问题转化为一维问题。另外,二维情况下我们定义部分和:PS[i][j] 等于以(1,1)、(i,1)、(1,j)、(i,j)为顶点的矩形区域的元素之和。
源代码:
#include<iostream> using namespace std; #define max(a,b) (((a)>=(b))?(a):(b)) int DC(int **PS,int a,int c,int i) { return PS[c][i]-PS[c][i-1]-PS[a-1][i]+PS[a-1][i-1]; } int main() { int Start,All; int m,n; int i,j; int **PS; int **A; int a,c; int maxnum=-1; cout<<"请输入行数:"; cin>>n; cout<<"请输入列数:"; cin>>m; PS=(int **)malloc(sizeof(int*)*(n+1)); A=(int **)malloc(sizeof(int*)*(n+1)); for (i=0;i<=n;i++) { PS[i]=(int *)malloc(sizeof(int)*(m+1)); A[i]=(int *)malloc(sizeof(int)*(m+1)); } cout<<"请输入"<<n<<"行"<<m<<"列数字:"<<endl; for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { cin>>A[i][j]; } } //求部分和 for (i=0;i<=n;i++) { PS[i][0]=0; } for (j=0;j<=m;j++) { PS[0][j]=0; } for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { PS[i][j]=A[i][j]+PS[i][j-1]+PS[i-1][j]-PS[i-1][j-1]; } } //枚举求出问题的解 for (a=1;a<=n;a++) { for (c=a;c<=n;c++) { Start=DC(PS,a,c,m); All=DC(PS,a,c,m); for (i=m-1;i>=1;i--) { Start=max(DC(PS,a,c,i),DC(PS,a,c,i)+Start); All=max(Start,All); if (All>maxnum) { maxnum=All; } } } } cout<<maxnum<<endl; return 0; }
运行结果:
以上!谢谢!
相关文章推荐
- 返回一个二维整数数组中最大子数组的和
- 返回一个二维整数数组中最大子数组的和。
- 最大子段和系列(二维子段和、环形数组子段和、最大m段和) 思路
- 子数组之和的最大值(二维)
- 二维矩阵由左上角到右下角只能向右或向下走所有可能路径取值之和最大值
- 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。
- 编写一个计算一维数组中所有整数的最大公约数的函数
- 求一个二维整数数组最大子数组之和,时间复杂度为N^2
- 求一个数组中所有元素的最大值及其索引位置
- 有一个整型二维数组,假设a[3][4] = {初始化了值},求出这个二维数组中所有的最大值,以及最大值对应的下标。 数组内部原有的值不能改变位置。
- 二维数组首尾相接,象个一条首尾相接带子一样,求所有子数组和的最大值
- 返回一个二维整数数组中最大联通子数组的和
- 结对开发之《返回一个二维整数数组中最大子数组的和》
- 返回一个二维整数数组中最大联通子数组的和
- 结对开发之返回一个二维整数数组中最大联通子数组的和
- 返回一个二维整数数组中最大联通子数组的和
- 返回一个二维整数数组中最大子数组的和(头尾相接)
- 返回一个二维整数数组中最大联通子数组的和
- 求数组中区间中最小数*区间所有数和的最大值
- 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。