标签:
输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。
#include <iostream>
#include <time.h>
using namespace std;
#define M 3
#define N 6
void main()
{
int a[M][2*N]={0},b[2*N],d = 0,d1 = 0;
int maxd[2*N]={0} ,end1[2*N] = {0},end2 = 0;
int i_max = 0,j_max = 0 ,jj = -1,j1 = 0,j2 = -1;
srand((unsigned int)time(0));
for (int i = 0;i < M;i++)
{
for (int j = 0;j < N;j++)
{
a[i][j] = rand()%50 - 25;
a[i][j+N] = a[i][j];
cout << a[i][j] << " ";
}
cout << endl;
}
maxd[0] = a[0][0];
for (int i = 0;i < M;i++)//i为0,表示1行,i为1表示两行数···
{
for (int i_hang = 0;i_hang < M-i;i_hang++)//当1行是循环3次
{
for (int j = 0;j < 2*N;j++)//赋初值
{
b[j] = 0;
}
for (int i_hang1 = i_hang;i_hang1 <= i_hang+i;i_hang1++)//每次循环i次赋值
{
for (int j = 0;j < 2*N;j++)
{
b[j] += a[i_hang1][j];
}
}
d = 0;j2 = -1;j1=0;jj=-1;
for (int ii = 0;ii < 2*N;ii++)
{
d += b[ii];
if (d > maxd[j1-1])
{
maxd[j1] = d;
end1[j1] = ii;
i_max = i; //最大的时候是i行;
j_max = i_hang; //
j1++;
j2 = jj;
}
if(d < 0)
{
d = 0;
jj = ii;
}
if (end1[j1-1] - j2 > N) //如果end1[j1-1] - j2大于N个数,那么就获取end1[j1-2]
{
j1--;
break;
}
}
end2 = j2+1;
}
}
cout << "子数组为:" << endl;
for (int k = 0;k <= i_max;k++)
{
for (int i = end2;i <= end1[j1-1];i++)
{
cout << a[j_max+k][i] << " ";
}
cout << endl;
}
cout << endl;
cout << "和为: " << maxd[j1-1] << endl;
}
标签:
原文地址:http://www.cnblogs.com/chengchengshuaio/p/4594919.html